• 検索結果がありません。

データ型・コード記述規則

N/A
N/A
Protected

Academic year: 2021

シェア "データ型・コード記述規則"

Copied!
18
0
0

読み込み中.... (全文を見る)

全文

(1)

配列・コード記述規則

VB 2005 ② □ 配列 ・配列の概要、配列の宣言、配列の初期化 ・配列の配列(ジャグ配列)、配列クラス ・複数の要素型の混在する配列 □ コレクション ・配列と仕て使用されるコレクション □ 構造体 ・構造体の宣言、構造体の使用方法 □ 列挙体 ・列挙体の宣言、列挙体の使用方法 □ 演算子 ・演算子の種類(代入、算術、文字列結合、ビットシフト、論理、比較) ・比較演算子を使用する上での注意点 □ データ型の変換 ・機能別一覧、解説、動作 □ コード記述の規則 ・コーディングの基礎(マルチステートメント、ステートメント分割、コメント等) ・数値の表記法 □ モジュールとクラス ・モジュール、クラス □ プロシージャ ・プロシージャの構文 今回の課題項目 □ 配列とコレクション □ 構造体と列挙体 □ 演算子 □ データ型の変換 今回の重点項目

(2)

■ 配列(Array)の概要 ■ 配列とは、同じ型のデータ要素の集合を謂う。変数を配列と仕て扱うと、一連の変数を同じ名前で参照 する事が出来る。配列を構成する夫々れの各要素には順序が有り、夫々れの要素はインデックス番号(添 字、要素番号とも謂う)で識別する。即ち、配列の各要素を参照するには、配列名とインデックス番号 を使用する(例:配列名A のインデックス番号 3 の要素を参照するには A(3) と記述する)。 配列のインデックス番号には下限(最小値、LBound 関数で参照可、常に 0 固定)と上限(最大値、UBound 関数で参照可)が有り、インデックス番号は、下限から上限迄の連続した整数値を取る。 配列(配列変数)を宣言するには、変数(単純変数)の宣言と同様、Dim ステートメントを使用して配 列名と要素数を指定する。但し、Visual Basic では、配列の要素数が固定されて居る固定サイズの配列 と、実行時に配列の要素数を変更する事の出来る動的配列が有り、動的配列の宣言では、宣言の時点で は、要素数を指定する必要は無い。 [適用範囲] [静的変数] Dim 配列名( [ 下限値 To ] 上限値 ) [As データ型] 例1:Dim A(15) … インデックス番号 0 ~ 15 の 16 個の要素を持つ配列 例2:Dim A(0 To 18) … インデックス番号 0 ~ 18 の 19 個の要素を持つ配列(下限値は常に 0 固定) 例3:Dim A( ) … 要素数を変更する事の出来る動的配列(ReDim ステートメントで要素数の指定)

配列の適用範囲・適用期限は、変数の宣言と同様、Public キーワード、Protected キーワード、Friend キーワード、Private キーワード、Static キーワードの孰れを使用するかに依り設定する事が出来る。 各キーワードの意味は、変数の宣言の場合と同じで有る。 配列は、単純な一方向の並びで有る1次元配列だけで無く、行と列を表す時に使用する2次元配列、立 体的なデータを扱う時に使用する3次元配列等の多次元配列(最大32 次元)も使用する事が出来る。 配列の要素は総て同じデータ型と成るが、データ型が Object 型の場合、各要素にはオブジェクト、文 字列、数値等の夫々れ異なるデータ型の値を格納(ポイント)する事も出来る。猶、複数の要素型が混 在する配列を作成するには、System.ArrayList オブジェクトを使用する事も出来る。

A(0) A(1) A(2) A(3) A(4) Dim A(4) 配列宣言例 配列名 添字最大数 配列とは、同じデータ型の複数の変数を一塊に仕て扱える様に仕た物で有る。名前(識別子)が同じで、変数で指 定する事の出来るインデックスで各要素を特定する事に依り、複数のデータを纏めて処理する事が出来る様に成る。 プログラムでは、一塊のデータを扱う事が多いので、配列は頻繁に利用される。 要素数の上限値は、整数型(Integer)の値の範囲内(±約 21 億)で無ければ成ら無いが、其の様な巨大なデータ を扱う事は先ず無い為、事実上、無制限と謂う事が出来るが、メモリに依存する。

(3)

■ 配列の宣言 ■ ■ 静的配列の宣言 スコープ Dim 配列変数名( 最大要素番号 [ , 最大要素番号 … ] ) As データ型 1 次元配列:Dim A( 15 ) … 16 個の要素を持つ配列 2 次元配列:Dim A( 5, 8 ) … 6×9 個の要素を持つ配列 3 次元配列:Dim A( 7, 12, 8 ) … 8×13×9 個の要素を持つ配列 ■ 動的配列の宣言 スコープ Dim 配列変数名( ) As データ型 1 次元配列:Dim A( ) … 空のパーレンを記述 2 次元配列:Dim A( , ) … パーレンの中に 1 個のカンマを記述 3 次元配列:Dim A( , , ) … パーレンの中に 2 個のカンマを記述 ■ 配列の格納領域の再割当 ReDim [ Preserve ] 配列変数名( 最大要素番号 [ , 最大要素番号 … ] ) ■ 配列の初期化 ■ ■ 配列変数の宣言と値の代入を別々に行う(従来の初期化) スコープ Dim 配列変数名( 最大要素番号 [ , 最大要素番号 … ] ) As データ型 配列変数名( 要素番号 ) = 値 ■ 配列変数の宣言と初期化を同時に行う(動的配列而巳) スコープ Dim 配列変数名( ) As データ型 = { 値 [ , 値 … ] } 例:Dim A( ) As Integer = { 3, 5, 7, 9 } … インデックス番号 0 ~ 3 の 4 個の要素を持つ配列 ■ 配列変数を一旦解放し新たに再割当を行う(従来の初期化) Erase 配列変数名: ReDim 配列変数名( 最大要素番号 [ , 最大要素番号 … ] ) ■ Nothing を指定して初期化を行う ReDim 配列変数名( Nothing ) ' 初期化された 1 個の要素を持つ配列(長さ 1 の配列)と成る。 ■ 要素数に-1 を指定して初期化を行う ReDim 配列変数名( -1 ) ' 要素を持たない配列(長さ 0 の配列)と成る。 Visual Basic 2005 では、配列の下限を明示する為に、( 下限値 To 上限値 ) の表記が復活したが、配列要素の下限 は、従来のバージョンでは任意に指定する事が出来たが、現在のバージョンでは必ず下限値は 0 から始まる。即ち Dim A( 1 To 10 ) As Integer の様な指定はエラーと成る。

Visual Basic 2005 では、ReDim を宣言と仕て使用出来ない。配列は、ReDim ステートメントに指定する前に、Dim、 又は、同等のステートメントを使用して、他の変数と同じ様に宣言する必要が有る。

亦、ReDim ステートメントで再割当を行う時、各次元の要素数の変更を行う事は出来るが、次元の再定義(次元の 変更)は出来ない。亦、Preserve キーワードを指定する場合は、要素数を変更出来るのは一番最後の次元而巳で、 他の各次元は、既存の配列と同じ要素数を指定する必要が有る。

(4)

■ 配列の配列(ジャグ配列) ■ 要素に配列を持つ配列は、配列の配列、又は、ジャグ配列と呼ばれ、各要素に依り要素数の異なる多次 元配列を作成する事が出来る。New 句を使用して作成し、配列変数に割り当てる。配列宣言の一部と仕 て、又は、後続の代入ステートメント内で此れを行う事が出来る。 猶、要素と仕て配列を持つ事は、1 つの配列に対して複数のインデックスを持つ多次元配列とは異なる 事に注意され度い。 亦、ジャグ配列は、共通言語仕様(CLS)に準拠して居ない。従って、CLS 準拠のコードが利用するク ラスからはジャグ配列を使用しない方が良い。 ■ ジャグ配列の意味 アプリケーションのデータ構造は、2 次元の配列で有っても、必ずしも、四角形の 2 次元配列では無い 場合が有る。例えば、月の配列が有り、其の各要素が日の配列で有る場合等が考えられる。月に依り日 数が異なる為、月要素は四角形の2 次元配列を形成しない。此の様な場合に、多次元配列の代わりにジ ャグ配列を使用して、メモリの節約を図る事が出来る(極端な場合には、メモリを大幅に節約出来る)。 ■ ジャグ配列の宣言 宣言の中で、入れ子に成った配列 1 レベルに付き 1 組の括弧を変数名の後に追加し、同じ数の括弧を New 句に追加する。要素の値を何も指定して居ない場合、複数のブレス( { } )は必要無い。猶、下記 の書式では、1 次元配列と仕て居るが、多次元配列の指定も可能で有る。 スコープ Dim 配列変数名( )( ) [ ( ) … ] As データ型 = New データ型( )( ) [ ( ) … ]{ }

例:Dim A( ) ( ) As Integer = New Integer ( 11 ) ( ) { } … 12 個の要素を持つ配列が、夫々れ配列を要素に持つ。

■ ジャグ配列の要素数の確保

ジャグ配列の各要素が持つ配列の要素数は、夫々れ異なる為、個々の要素に付いて、其の要素が持つ配 列の要素数を指定する必要が有る。

配列変数名( 要素番号 ) = New データ型( 要素数 ){ }

例:A( 0 ) = New Integer ( 11 ){ } … 配列 A の要素 0 は、12 個の要素を持つ配列を要素に持つ。 例:A( 1 ) = New Integer ( 15 ){ } … 配列 A の要素 0 は、16 個の要素を持つ配列を要素に持つ。

■ ジャグ配列の例

整数型(Integer)の要素が配列と成って居る配列を保持する配列変数を宣言する例を、下記に示す。配 列A の各要素自体が、月を表す配列と成り、各月の配列は、其の月の各日付毎の値を保持する。

Dim A( )( ) As Integer = New Integer(11)( ) { } For I As Integer = 1 To 12

Dim D As Integer = DateTime.DaysInMonth( DateTime.Now.Year, I ) A( I - 1 ) = New Integer( D - 1 ) { }

Next

上記の例の場合、ジャグ配列は2 次元配列と比べて、7 個少ない要素(閏年の場合は 6 個少ない要素) を確保する。極端な場合には、メモリを大幅に節約出来る。

(5)

■ 配列クラス ■

総ての配列は、System 名前空間の Array クラスから継承される。従って、総ての配列で、Array のメ ソッドやプロパティにアクセス出来る。 ■ 配列クラスメンバ Array クラスの主要なプロパティには、下記の物が有る。 名前 説明 IsFixedSize Array が固定サイズか何うかを示す値を取得する。 IsReadOnly Array が読み取り専用か何うかを示す値を取得する。 Length Array の総ての次元内の要素の総数を表す 32 ビット整数を取得する。 LongLength Array の総ての次元内の要素の総数を表す 64 ビット整数を取得する。 Rank Array のランク(次元数)を取得する。 Array クラスの主要なメソッドには、下記の物が有る。 名前 説明 BinarySearch 並べ替え済みの1 次元の Array 内で値を検索(バイナリサーチ)する。 Clear Array 内の要素の範囲を、要素の型に応じて、初期化する。 ConvertAll ある型の配列を別の型の配列に変換する。 Copy Array の要素範囲を他の Array にコピーする。

CopyTo 現在の1 次元 Array の総ての要素を指定した 1 次元 Array にコピーする。 Exists Array 内に、指定された条件と一致する要素が含まれて居るか何うかを判断する。 Find Array 内で、指定された条件と一致する要素を検索し、最初の要素を返す。 FindAll Array 内で、指定された条件と一致する総ての要素を取得する。 FindLast Array 内で、指定された条件と一致する要素を検索し、最後の要素を返す。 GetLength Array の指定した次元に有る要素の数を表す 32 ビット整数を取得する。 GetLongLength Array の指定した次元に有る要素の数を表す 64 ビット整数を取得する。 GetUpperBound Array 内の指定した次元の上限を取得する。 IndexOf Array 内で、値が最初に見付かった位置のインデックス番号を返す。 LastIndexOf Array 内で、値が最後に見付かった位置のインデックス番号を返す。 Reverse Array の範囲内の要素の順序を反転させる。 Sort 1 次元 Array オブジェクト内の要素を並べ替える。 ■ 複数の要素型が混在する配列 ■ 配列で宣言するのは 1 種のデータ型丈で有る。従って、総ての要素は其のデータ型で有る必要が有る。 総ての要素は綿密に関連し合って居り、類似した型の値を持つ為、通常は此の制約は望ましい物で有る。 併し、場合に依っては要素が綿密に関連して居なかったり、類似した型の値を持って居ない場合が有る。 其の様な場合は、オブジェクト型(Object)の配列要素を宣言出来る。個々の要素は、数字、文字、文 字列、オブジェクト、及び、他の配列等、異なる種類のデータをポイント出来る様に成る。 Object データ型を使用する場合、特定のデータ型を指定した場合に比べてパフォーマンスの効率は劣る 事を念頭に置いて貰い度い。此れは実行時に、ボックス化とボックス化解除と呼ばれる操作に依り、通 常のデータ型と Object の間でデータ変換を行う必要が有る為で有る。此れを頻繁に実行すると、此の 様な追加の処理に依りパフォーマンスに影響を及ぼす場合が有る。

(6)

■ 配列と仕て使用されるコレクション ■ ■ System.Collections 名前空間 System.Collections 名前空間は、リスト、キュー、ビット配列、ハッシュテーブル、ディクショナリ等 のオブジェクトの様々なコレクションを定義するインターフェイスとクラスを格納して居る。 System.Collections 名前空間に含まれる主なクラスは、下記の通りで有る。 クラス 説明 ArrayList 必要に応じてサイズが動的に増加する配列 BitArray ビット値の小型の配列 Hashtable キーと値ペアのコレクション(連想配列) SortedList キーと値ペアのコレクション(キーで並べ替えられた連想配列) Queue 先入れ先出し(FIFO)のコレクション Stack 後入れ先出し(LIFO)のコレクション ■ System.Collections.Generic 名前空間 System.Collections.Generic 名前空間には、ジェネリックコレクションを定義するインターフェイスと クラスが含まれて居る。此のコレクションを使用する事に依り、タイプセーフでパフォーマンスが高い 厳密に型指定されたコレクションを作成する事が出来る。 System.Collections.Generic 名前空間に含まれる主なクラスは、下記の通りで有る。 クラス 説明 Dictionary キーと値のコレクション SortedDictionary キーと値ペアのコレクション(キーで並べ替えられた連想配列) LinkedList 二重にリンクされたリスト List 厳密に型指定されたオブジェクトのリスト(含む検索、並替機能) SortedList キーと値ペアのコレクション(キーで並べ替えられた連想配列) Queue 先入れ先出し(FIFO)のコレクション Stack 後入れ先出し(LIFO)のコレクション ■ System.Collections.Specialized 名前空間 System.Collections.Specialized 名前空間には、特殊な厳密に型指定されたコレクションが含まれて居 る。例えば、リンクされたリストディクショナリ、ビットベクタ、文字列丈を含むコレクションが有る。 クラス 説明 CollectionsUtil 文字列の大文字と小文字を区別しないコレクション HybridDictionary ListDictionary と Hashtable に切り替わるコレクション

ListDictionary 格納する項目数が通常10 以下の場合に推奨されるシングルリンクリスト NameValueCollection 文字列キーと文字列値のコレクション(配列+連想配列)

OrderedDictionary キーと値ペアのコレクション(キーとインデックスで並べ替えられた連想配列)

(7)

構造体(Structure)とは、データ構造を定義する物を謂い、ユーザー(プログラマー)が任意に定義 するデータ型を謂う。即ち、.NET Frameworks がサポートする複数のデータ型を組み合わせて、独自 のデータ型を作成する事が出来る。構造体を使用すると、幾つかの関連した情報を1個の変数で表す事 が出来る様に成る。 ■ 構造体の宣言 ■ ■ 構造体の宣言 スコープ Structure 構造体名 スコープ メンバ名 As データ型 … End Structure 各メンバのスコープを省略する事は出来ない。規定値のDim を指定すると Public スコープと成る。 ■ 構造体の使用方法 ■ ■ 構造体変数の宣言 構造体の変数を宣言するには、変数の宣言と同様、スコープを表すステートメントや、Static ステート メントの孰れかを使用して変数名を宣言し、データ型に構造体を指定する。 スコープ Dim 変数名 As 構造体名 単純変数の場合 スコープ Dim 配列変数名(最大要素番号[, 最大要素番号 …]) As 構造体名 静的配列の場合 スコープ Dim 配列変数名( ) As 構造体名 動的配列の場合 Static 変数名 As 構造体名 単純変数の場合 Static 配列変数名(最大要素番号[, 最大要素番号 …]) As 構造体名 静的配列の場合 Static 配列変数名( ) As 構造体名 動的配列の場合 ■ 各メンバへの値の代入 構造体で宣言された変数は、複数の要素(フィールド)を持つ事に成り、各要素の参照は、変数名の後 ろにピリオドに続き要素名を記述して、オブジェクトのプロパティの設定や取得と同様の方法で行う。 変数名.メンバ名 = 値 配列変数名(要素番号).メンバ名 = 値

同等の機能を持つ物と仕て、従来のバージョンではユーザー定義型を使用して居たが、現在のバー ジョンでは、ユーザー定義型は廃止され、構造体を使用する。亦、ユーザー定義型では、各メンバ は既定では全てPublic アクセスで有り、明示的なスコープの宣言はオプションとされて居たが、構 造体では、全てのメンバにアクセス修飾子を指定する必要が有る。 メンバのスコープにPrivate を指定 すると、其のメンバは、構造体の外 部からアクセスする事は出来ない。

(8)

列挙体(Enumeration)とは、一連の定数値を定義する物を謂い、関連の有る定数のメンバを連結した 物で有る。 ■ 列挙体の宣言 ■ ■ 列挙体の宣言 スコープ Enum 列挙体名 As データ型 メンバ名 = 値 … End Enum ■ 列挙体の使用方法 ■ ■ 列挙体の利用 列挙体を利用する場面と仕ては、プロシージャの引数等に、或る決められた値を指定させる様な場合が 有る。此の場合、引数のデータ型を列挙体と仕て宣言すれば、決められた値以外の値が渡される様な不 具合を減少させる事が出来る。

列挙体に含まれるメンバは全て同じデータ型に成り、Byte、Short、Integer、Long のデータ型而 巳が使用出来る。型宣言を省略した場合は、規定値のInteger 型と看做される。 列挙体の利用例 „ 列挙体の宣言

Public Enum Direction As Integer East = 3 West = 9 North = 0 South = 6 End Num „ 列挙体を引数に指定

Public Sub DispDirection(ByVal Direct As Direction) …

(9)

■ 演算子の種類 ■ ■ 代入演算子 代入演算子(変数に値を代入する時に使用する演算子) 種類 演算子 記述例 結果 代入 = A = 3 3 → A 加算代入 += A += 3 A+3 → A 減算代入 -= A -= 3 A-3 → A 乗算代入 *= A *= 3 A*3 → A 除算代入 /= A /= 3 A/3 → A 整数除算代入 \= A \= 3 A\3 → A 冪乗代入 ^= A ^= 3 A^3 → A

結合代入 &= A &= B A & B → A 左シフト代入 <<= A = 10: A <<= 3 80 → A 右シフト代入 >>= A = 80: A >>= 3 10 → A ■ 算術演算子 算術演算子(算術演算を行う時に使用する演算子) 種類 演算子 記述例 結果 加算(足し算) + 10+3 13 減算(引き算) - 10-3 7 乗算(掛け算) * 10*3 30 除算(割り算) / 10/3 3.3333333… 整数除算(商) \ 10\3 3 剰余(余り) Mod 10 Mod 3 1 冪乗 ^ 10^3 1000 ■ 文字列結合演算子(連結演算子) 文字列結合演算子(文字列の結合を行う時に使用する演算子) 種類 演算子 記述例 結果

結合 & 又は + “ab” & “cd” “abcd” ■ ビットシフト演算子 ビットシフト演算子(ビット操作を行う演算子) 種類 演算子 記述例 結果 左シフト << b = 10: A = B << 2 40 → A 右シフト >> b = 40: A = B >> 2 10 → A ※ シフトは、循環的に行われず、算術シフトが行われる。即ち、一方の端から外み出したビットが他 方の端に補われる事は無い(ローテーションでは無い)。

(10)

■ 論理演算子 論理演算子(論理演算を行う時に使用する演算子) 種類 演算子 記述例 結果 論理積 And 10 And 3 2 論理和 Or 10 Or 3 11 論理否定 Not Not 10 5 又は –11 排他的論理和 Xor 10 Xor 3 9

簡略的論理積 AndAlso False AndAlso (Any) False 簡略的論理和 OrElse True OrElse (Any) True

※ 簡略的(ショートサーキット)とは、AndAlso 式の 1 番目の式の評価が False の場合は、2 番目の 式の評価が孰れで有ろうとも最終的な結果は変わらないので、2 番目の式は評価されないで False を返し、亦、OrElse 式の 1 番目の式の評価が True の場合は、2 番目の式の評価が孰れで有ろうと も最終的な結果は変わらないので、2 番目の式は評価されないで True を返すと謂う様に、結果が確 定した時点で直ちに結果を返す事を謂う。 ※ And 演算子は、条件式で x>0 And x<100 の様に使用する。 ※ Or 演算子は、条件式で x=0 Or x=100 の様に使用する。 ※ Not 演算子は、条件式で Not(x>100) の様に使用する。 ■ 比較演算子 比較演算子(比較を行う時に使用する演算子) 種類 演算子 記述例 結果 等しい = 10=3 False 等しく無い <> 10<>3 True より小さい < 10<3 False より大きい > 10>3 True 以下 <= 10<=3 False 以上 >= 10>=3 True 文字列比較 Like 文字列のパターン比較に使用する(下表参照)。 等価比較 Is オブジェクト変数の等価比較に使用する。 非等価比較 IsNot オブジェクト変数の非等価比較に使用する。 パターン 意味 例 結果

? 任意の1文字 “set” Like “s?t” True * 任意の数の文字 “seat” Like “s*t” True # 任意の1文字の数字(0~9) “101” Like “1#1” True [リスト] リスト中の任意の1文字 “a1” Like “[abc]1” True [!リスト] リスト以外の任意の1文字 “d1” Like “[!abc]1” True

■ 比較演算子を使用する上での注意点 ■ ■ 文字列の比較や異なるデータ型での比較

比較演算子を文字列に適用する場合は、通常はアルファベット順、又は、文字コードの小さい順で評価 されるが、国別の設定に依り異なる場合が有る。亦、Decimal 型の式を Single 型や Double 型の式と比 較する場合は、Decimal 型の式が Single 型や Double 型に変換される。亦、Decimal 型の場合 1E-28 より小さい小数値は失われる事が有る。其の結果、本来は等しく無い数値の比較が、等しいと判断され る可能性が有る。

(11)

Microsoft.VisualBasic 名前空間の Visual Basic ランタイムライブラリに含まれるデータ型の変換に関 する関数を、下記に示す。此等は、Visual Basic から使用する場合、特に参照設定の必要は無い。

データ型を変換する関数

変換関数 変換先のデータ型

CBool( ) ブール型(Boolean) CByte( )、CSByte( ) バイト型(Byte)

CChar( ) キャラクタ型(Char):文字列の最初の文字を変換 CDate( ) 日付型(Date)

CShort( )、CUShort( ) 短整数型(Short) CInt( )、CUInt( ) 整数型(Integer) CLng( )、CULong( ) 長整数型(Long) CSng( ) 単精度浮動小数点数型(Single) CDbl( ) 倍精度浮動小数点数型(Double) CDec( ) 十進数型(Decimal) CObj( ) オブジェクト型(Object) CStr( ) 文字列型(String) Ctype( ) 指定されたデータ型 文字列を数値に変換する関数 変換関数 変換先のデータ型 Val( ) 適切な数値型(Short、Integer、Long、Single、Double) 数値を文字列に変換する関数 変換関数 変換先のデータ型 Str( ) 文字列型(String) Format( ) 書式指定文字列で指定された形式に変換した文字列(String) 8進数・16進数に変換する関数 変換関数 変換先のデータ型 Oct( ) 8 進数に変換した文字列(String) Hex( ) 16 進数に変換した文字列(String) 文字と文字コードを変換する関数 変換関数 変換先のデータ型

Asc( )、AscW( ) 文字コード(Integer) Chr( )、ChrW( ) 文字(Char、String)

文字列の大文字・小文字を変換する関数

変換関数 変換先のデータ型

LCase( )、UCase( ) 大文字・小文字に変換した文字列(String)

StrConv 大文字・小文字に変換した文字列(String)全角・半角の変換も可

(12)

■ 解説

規則と仕て、Visual Basic の型変換関数は、System.Convert クラスと個々の型構造体やクラスの両方 で、ToString 等の .NET Framework メソッドよりも優先して使用する。Visual Basic 関数は、Visual Basic コードへの対応に最適化されて居り、ソースコードをより短く、より読み易くする。更に、Boolean をInteger に変換する場合等、.NET Framework の変換メソッドは、Visual Basic 関数と同じ結果を生 成するとは限らない。 ■ 動作 ・強制型変換 一般に、或る操作結果を既定のデータ型ではなく特定のデータ型に強制的に変換する場合は、データ 型変換関数を使用する。例えば、単精度、倍精度、又は、整数で計算を行うような場合に、CDec 関 数を使用して10 進の演算を強制的に行う。 ・変換の失敗 関数に渡された引数の値が変換されるデータ型の範囲を超えて居る場合、OverflowException が発生 する。 ・小数部分 非整数型の値を整数型に変換する場合、整数変換関数(CByte、CInt、CLng、CSByte、CShort、 CUInt、CULng、CUShort)は、最も近い整数に値を丸めて小数部分を取り除く。 小数部分が丁度0.5 の時、整数変換関数は、此れを最も近い偶数に丸める。例えば、0.5 は 0 に、1.5 と2.5 は孰れも 2 に成る。此れは、銀行型丸めとも呼ばれ、此の様な数値を大量に加算する時に蓄積 される偏りを調整する目的で使用される。

Int 関数や Fix 関数は、小数部分を丸めるのではなく、切り捨てるので、CInt や CLng とは異なる。 亦、Int 関数や Fix 関数は、常に、引き渡された値と同じデータ型で値を返す。

・日付・時刻の変換

値を日付や時刻に変換出来るか何うかを確認するには、IsDate 関数を使用する。CDate は、日付リ テラルと時刻リテラルを認識するが、数値は認識しない。Visual Basic 6.0 の Date 値を Visual Basic 2005 の Date 値に変換するには、System.DateTime.FromOADate(System.Double) メソッドを使用 する。 ・日付・時刻の基準値 日付型(Date)には、常に日付と時刻の両方の情報が含まれて居る。型変換の為に、Visual Basic は 1/1/0001(西暦 1 年 1 月 1 日)を日付の基準値と看做し、00:00:00(午前 0 時)を時刻の基準値と看 做す。日付型(Date)の値を文字列に変換する場合、CStr は、結果の文字列に基準値を含めない。 例えば、#January 1, 0001 9:30:00# を文字列に変換すると、結果は "9:30:00 AM" と成り、日付情 報が省略される。但し、元の日付型(Date)の値には、日付情報が残って居り、DatePart 関数等の 関数を使用して復元する事が出来る。 ・カルチャの区別 文字列を扱う型変換関数は、アプリケーションの現在のカルチャ設定に基づいて変換を実行する。例 えば、CDate は、システムのロケール情報に基づいて日付の形式を認識する。日、月、年は、ロケー ルに対応した正しい順序で指定する必要が有る。然う仕ないと、日付が正しく解釈されない場合が有 る。日付の形式が、曜日文字列(Wednesday 等)を含む長い形式の場合も認識出来ない。 ロケールで指定されて居る物以外の書式の、値の文字列形式を扱った変換では、Visual Basic の型変 換関数は使用出来ない。此の変換では、其の値の型のToString メソッドや Parse メソッドを使用す る。例えば、文字列をDouble に変換するには System.Double.Parse メソッドを使用し、Double 型 の値を文字列に変換するには System.Double.ToString メソッドを使用する。

(13)

猶、Visual Basic.NET 以降では、Visual Basic の総ての基本データ型は、System 名前空間の構造体か クラスに依りサポートされて居る。データ型は、クラス名のエイリアス(別名)で有り、元のクラスの メソッド等のメンバを備えて居る。例えば、Dim N As Integer と宣言した変数 N は、System.Int32 ク ラスのToString メソッドを使用して文字列化する事が出来る。 ※ 構造体は値型で有り、クラスは参照型で有る。従って、Char や Integer 等の値型は、構造体に依っ て実装され、亦、Object や String 等の参照型は、クラスに依ってサポートされる。但し、メンバが 値型で有っても、総ての配列は参照型で、亦、参照型メンバを有して居ても、総ての構造体は値型 で有る。 亦、System.Covert クラスには、データ型を変換するメソッドが多数用意されて居るので、他言語(例 えば、C#等)との互換性を考えた場合、此等を使用する事が望ましい。

下記にVisual Basic の型変換関数に対応する .NET Frameworks のメソッドを示す。 変換関数 .NET Frameworks のメソッド CBool( ) System.Convert.ToBoolean( )

CByte( )、CSByte( ) System.Convert.ToByte( )、System.Convert.ToSByte( ) CChar( ) System.Convert.ToChar( )

CDate( ) System.Convert.ToDateTime( )

CShort( )、CUShort( ) System.Convert.ToInt16( )、System.Convert.ToUInt16( ) CInt( )、CUInt( ) System.Convert.ToInt32( )、System.Convert.ToUInt32( ) CLng( )、CULong( ) System.Convert.ToInt64( )、System.Convert.ToUInt64( ) CSng( ) System.Convert.ToSingle( ) CDbl( ) System.Convert.ToDouble( ) CDec( ) System.Convert.ToDecimal( ) CObj( ) 無い CStr( ) System.Convert.ToString( )、System.Object.ToString( ) CType( ) System.Convert.ChangeType( ) Val( ) 無い Str( ) System.Convert.ToString( ) Format( ) System.String.Format( ) Oct( ) 無い Hex( ) Object.ToString("x")

Asc( )、AscW( ) System.Convert.ToInt32(文字) Chr( )、ChrW( ) System.Convert.ToChar(文字コード)

LCase( )、UCase( ) System.String.ToLower( )、System.String.ToUpper( )

StrConv 無い

※ CObj に相当する物は無いが、CType で Object 型に変換する事が出来る。 ※ CType は、DirectCast や TryCast でも、同等の変換を行う事が出来る。

※ 8 進数文字列に変換する書式文字列は無いが、特殊な用途で無い限り、必要とする事は無い。 ※ 8 進数文字列を数値に変換するには、System.Convert.ToInt32( "8 進数文字列", 8 ) を使用する。 ※ 16 進数文字列を数値に変換するには、System.Convert.ToInt32( "16 進数文字列", 16 ) を使用する。

(14)

■ コーディング(Coding)の基礎 ■ ■ 複数ステートメントを1行に結合

通常Visual Basic では、1ステートメントを1行に記述し、ステートメント終了記号は無いが、複 数のステートメントをマルチステートメント記号で有るコロン( : )で区切り、1行に記述する事 も出来る。

例:Text1.Text = “Hello” : Text1.BackColor = 255 ■ ステートメントを複数行に分割 長いステートメントは、行継続文字で有るスペースとアンダースコアの組合せ( _ )を使用して コードウィンドウで複数行に分割して記述する事が出来る。但し、行継続文字の後ろに続けてコメ ントを記述する事は出来ず、亦、1 論理行に使用出来る行継続文字は最大 25 個で有る。 ■ コメントの入力 コメント記号で有るアポストロフィ( ' )を使用して、コードにコメントを記述する事が出来る。 コメント記号から其の行の行末迄の記述は、実行時には無視され、何も処理され無い。 ■ 数値の表記法 ■ Visual Basic では、10 進数(10 を基数とする数値表現)の他に、8 進数(8 を基数とする数値表現)、 16 進数(16 を基数とする数値表現)が使用出来る。 ■ 10 進数の表記法 10 進数は、数値而巳を記述する(例:15)。 使用出来る文字は、0 ~ 9 迄の数字で有る。 ■ 16 進数の表記法 16 進数は、数値の前に&H を付加して表現する(例:&HF)。 使用出来る文字は、0 ~ 9 迄の数字と A ~ F のアルファベットで有る。 ■ 8 進数の表記法 8 進数は、数値の前に&O を付加して表現する(例:&O17)。 使用出来る文字は、0 ~ 7 迄の数字で有る。

猶、8 進数や 16 進数で末尾にアンパサンド( & )を付加すると、其の数値は長整数型と仕て記憶 される(システムカラーの表現等で使用されて居る)。

(15)

■ モジュール ■ ■ モジュール(Module)とは 独立して独自の機能を果たす様に設計された物を謂い、Visual Basic では、フォームモジュール、標準 モジュール、クラスモジュール等、Visual Basic のプログラムを構成する物を謂う。 ■ モジュールの作成 他のモジュールやクラスのブロックの外で、下記の様にモジュールブロックを宣言する。 スコープ Module モジュール名 … End Module モジュール名には任意の名前を指定する。亦、スコープは、Public か Friend を指定するが、省略可能 で有り、省略された場合はFriend スコープを指定した事に成る。 ■ クラス ■ ■ クラス(Class)とは プロパティやメソッド等、オブジェクトの様々な特性を定義する物を謂い、オブジェクトは、クラスを テンプレートと仕て作成される。 ■ クラスの作成 他のモジュールやクラスのブロックの外で、下記の様にクラスブロックを宣言する。 スコープ Class クラス名 … End Class

クラス名には任意の名前を指定する。亦、スコープは、Public か Friend か Protected か Private を指 定するが、省略可能で有り、省略された場合はFriend スコープを指定した事に成る。 ■ クラスのインスタンス化 クラスはオブジェクトのテンプレートで有り、使用する際にはインスタンス化(実体化)する必要が有 る。クラスをインスタンス化するには、下記の様に、クラスオブジェクトのオブジェクト変数を宣言し、 其のオブジェクト変数にNew キーワードを使用してクラスオブジェクトを代入する。 Dim オブジェクト変数名 As クラス名 オブジェクト変数名 = New クラス名

他のモジュールやクラスのブロックの外で、モジュールブロックやクラスブロックを宣言する事が 出来ると謂う事は、例えば、フォームモジュールのソースコードに、標準モジュールやクラスモジ ュールのコードを記述出来る事を意味して居る。

(16)

プロシージャ(Procedure)とは、独立して機能する一纏りのプログラムコードを謂い、Visual Basic では、サブルーチンや関数を纏めてプロシージャと呼ぶ(メソッドとも謂う)。値を返さないSub プロ シージャ(サブルーチン)、値を返す Function プロシージャ(関数)、イベントに対応するイベントプ ロシージャ、オブジェクトの特性(属性)を表現するプロパティプロシージャ等が有る。 ■ プロシージャの構文 ■ ■ Sub プロシージャの構文 スコープ Sub プロシージャ名( [ByVal|ByRef] 引数名 As データ型 [ ,… ] ) … End Sub ■ Function プロシージャの構文 スコープ Function プロシージャ名( [ByVal|ByRef] 引数名 As データ型 [ ,… ] ) As データ型 … End Function ■ Event プロシージャの構文 スコープ Sub オブジェクト名_イベント名(既定の引数) Handles イベントハンドラ … End Sub ■ Property プロシージャの構文 スコープ property プロパティ名( ) As データ型 Get Return 値 End Get

Set ( ByVal Value As データ型 ) メンバ変数 = Value end Set End Sub

引数の既定の引渡し方法は、従来のバージョンでは参照渡し(ByRef)だが、現在のバージョンで は値渡し(ByVal)に変更され、引渡し方法を省略すると ByVal を指定した事に成る。 Event プロシージャでは、イベントハンドラ(オブジェクト名.イベント名)を、カンマ(,)で区 切り、複数指定する事が出来る。此れに依り、複数のオブジェクトの異なるイベントに対して、同 じEvent プロシージャを共有する事が出来る。 既定の引数にはsender と e が 有り、sender は此のイベント プロシージャを呼び出したオ ブジェクトを、e はイベントデ ータを示す変数で有る。

(17)

■ 実行方法(イベント駆動、呼出)に依るプロシージャの分類 ■ ■ イベントプロシージャ(Event Procedure) オブジェクトがイベントの発生を認識した時に、其のイベントに対応して自動的に呼び出されるプロシ ージャをイベントプロシージャと呼ぶ。 ■ ジェネラルプロシージャ(General Procedure) 特定のイベントに割り当てられて居ないプロシージャをジェネラルプロシージャと呼び、主に共通コー ドを記述する為に使用する。ジェネラルプロシージャは、アプリケーションから明示的に呼び出さ無け れば実行され無い。 ■ 適用範囲(スコープ)に依るプロシージャの分類 ■ ■ Private プロシージャ Private プロシージャは、其のモジュールの中丈で呼び出す事が出来、他のモジュールから呼び出す事 は出来ない。 ■ Public プロシージャ Public プロシージャは、プロジェクト内の総てのモジュールから呼び出す事が出来る。 ■ 応答機能(戻り値)に依るプロシージャの分類 ■ ■ Sub プロシージャ 値を返さ無い(戻り値の無い)プロシージャをSub プロシージャと呼ぶ。 Exit Sub ステートメントに依りプロシージャを強制的に終了する事が出来る。 ■ Function プロシージャ 値を返す(戻り値の有る)プロシージャをFunction プロシージャと呼ぶ。

Exit Function ステートメント、又は、Return ステートメントに依りプロシージャを強制的に終了する 事が出来る。 イベントプロシージャ イベントプロシージャ イベントプロシージャ ジェネラルプロシージ ャ 制御を戻す 制御を戻す 制御を戻す

(18)

■ モジュール ■ ■ Option Private Module ステートメント

Visual Basic 6.0 では、Option Private Module ステートメントで、モジュール全体がプライベートに 設定し、其のコンポーネントにプロジェクト外部からはアクセス出来ない様にする事が出来たが、 Visual Basic 2005 では、Option Private Module ステートメントはサポートされて居らず、モジュール をプライベートとして宣言する事は出来ない。但し、モジュールの一部、又は、総てのメンバをプライ ベートと仕て宣言する事は出来る。猶、モジュールとは異なり、クラスはプライベートにする事が出来 る為、モジュール自体をプライベートと仕て動作させる必要が有る場合は、代わりにクラスを使用する。 ■ プロシージャ ■ ■ イベントプロシージャ Visual Basic 6.0 では、イベントプロシージャのプロシージャ名は、厳密にオブジェクトとイベントの 種類を示す物(イベントハンドラ)で有り、其の名前を任意に変更する事は出来なかったが、Visual Basic.NET 以降では、イベントハンドラ(オブジェクト名.イベント名)は、プロシージャ宣言の末尾 で、Handles キーワードに依り指定する為、プロシージャ名を任意に変更する事が出来る。 亦、Visual Basic 6.0 では、イベントが特定のオブジェクトに結び付けられ、個別のオブジェクトにイ ベント処理コードが用意されて居た為、コントロール配列を除き、複数のオブジェクトで、同じイベン ト処理コードを共有する事は出来なかったが、Visual Basic.NET 以降では、Handles 節に複数のイベ ントハンドラをカンマで区切り指定する事が可能な為、複数のオブジェクトで、同じイベント処理コー ドを共有する事が出来る。 此れは、Visual Basic.NET 以降では、コントロール配列が廃止された事を補う手段と仕て用いる事が 出来るが、更に、種類の異なる複数のオブジェクト(例えば、ボタンとラベル)で、同じイベント処理 コードを共有する事が出来る事を意味する。 但し、一方がClick イベントで、他方が MouseUp イベントと謂う様に、引数と仕てシステムから与え られる情報が異なる時は、同じイベント処理コードを共有する事は出来ない。 ■ 引数の扱い

Visual Basic 6.0 では、引数は、既定で、参照渡し(ByRef:引数の元と成る変数の格納アドレスを渡 す)で有ったが、Visual Basic.NET 以降では、既定で、値渡し(ByVal:引数の元と成る変数に格納さ れて居る値を渡す)に変更された。 此れは、引数の元と成る変数の値を不用意に変更しない為、安全性を重視した措置で有る。勿論、引数 の宣言でByRef キーワードを付加する事に依り、必要な場合は、参照渡しとする事は可能で有る。 亦、イベントプロシージャの場合、既定の引数は、sender と e に統一されて居る。sender は、当該イ ベントプロシージャを呼び出したオブジェクト(イベントを発生させたトリガーオブジェクト)を、e は、イベントデータ(例えば、MouseDown イベントでは、マウスボタンが押し下げられた位置等)を 示す変数で有る。

.

.

N

N

E

E

T

T

参照

関連したドキュメント

私たちの行動には 5W1H

また、2020 年度第 3 次補正予算に係るものの一部が 2022 年度に出来高として実現すると想定したほ

l 「指定したスキャン速度以下でデータを要求」 : このモード では、 最大スキャン速度として設定されている値を指 定します。 有効な範囲は 10 から 99999990

れをもって関税法第 70 条に規定する他の法令の証明とされたい。. 3

サンプル 入力列 A、B、C、D のいずれかに指定した値「東京」が含まれている場合、「含む判定」フラグに True を

新設される危険物の規制に関する規則第 39 条の 3 の 2 には「ガソリンを販売するために容器に詰め 替えること」が規定されています。しかし、令和元年

・条例第 37 条・第 62 条において、軽微なものなど規則で定める変更については、届出が不要とされ、その具 体的な要件が規則に定められている(規則第

基準の電力は,原則として次のいずれかを基準として決定するも