ローカル型の推論 (Visual Basic)
Visual Basic コンパイラは、"型推論" を使用し、As
句を使用しないで宣言されたローカル変数のデータ型を判定します。 コンパイラは、初期化式の型から変数の型を推論します。 これにより、次の例で示すように、明示的に型を指定せずに変数を宣言できます。 この宣言の結果として、num1
と num2
の両方が整数として厳密に型指定されます。
Public Sub inferenceExample()
' Using explicit typing.
Dim num1 As Integer = 3
' Using local type inference.
Dim num2 = 3
End Sub
Note
前の例の num2
を Integer
として型指定しない場合は、Dim num3 As Object = 3
や Dim num4 As Double = 3
などの宣言を使用して別の型を指定できます。
Note
型推論は、非静的なローカル変数に対してのみ使用できます。クラス フィールド、プロパティ、または関数の型を判定するために使用することはできません。
ローカル型推論は、プロシージャ レベルで適用されます。 モジュール レベル (プロシージャまたはブロック内ではなく、クラス、構造体、モジュール、またはインターフェイス内) での変数の宣言に使用することはできません。 前述の例の num2
が、プロシージャ内のローカル変数ではなくクラスのフィールドである場合、Option Strict
が on に設定されている場合は宣言でエラーが発生し、Option Strict
が off に設定されている場合は num2
が Object
として分類されます。 同様に、ローカル型推論は、Static
として宣言されたプロシージャ レベルの変数に適用されません。
型推論と遅延バインディング
型推論を使用するコードは、遅延バインディングに依存するコードに似ています。 ただし、型推論では、変数は Object
のままではなく、厳密に型指定されます。 コンパイラは、コンパイル時に変数の初期化子を使用して変数の型を判定し、事前バインド コードを生成します。 前述の例では、num2
は、num1
と同様、Integer
として型指定されます。
事前バインド変数の動作は、型が実行時にしか認識されない遅延バインド変数の動作とは異なります。 型が早期に認識されることにより、コンパイラは、実行前に問題を特定し、メモリを正確に割り当て、その他の最適化も行うことができます。 また、事前バインディングにより、Visual Basic 統合開発環境 (IDE) では、オブジェクトのメンバーに関する IntelliSense ヘルプを提供できます。 事前バインディングは、パフォーマンスのためにも推奨されます。 遅延バインド変数に格納されるデータはすべて Object
型としてラップする必要があり、実行時にその型のメンバーにアクセスすると、プログラムの速度が低下するためです。
使用例
型推論は、ローカル変数が As
句を使用しないで宣言され、初期化されたときに発生します。 コンパイラは、割り当てられた初期値の型を変数の型として使用します。 たとえば、次のコード行はそれぞれ、String
型の変数を宣言します。
' Using explicit typing.
Dim name1 As String = "Springfield"
' Using local type inference.
Dim name2 = "Springfield"
次のコードは、同じ整数の配列を作成する 2 通りの同等の方法を示しています。
' Using explicit typing.
Dim someNumbers1() As Integer = New Integer() {4, 18, 11, 9, 8, 0, 5}
' Using local type inference.
Dim someNumbers2 = New Integer() {4, 18, 11, 9, 8, 0, 5}
ループ制御変数の型を判定するには、型推論を使用すると便利です。 次のコードでは、前述の例の someNumbers2
が整数の配列であるため、コンパイラは、number
が Integer
であると推論します。
Dim total = 0
For Each number In someNumbers2
total += number
Next
次の例で示すように、ローカル型推論を Using
ステートメントで使用して、リソース名の型を確定することができます。
Using proc = New System.Diagnostics.Process
' Insert code to work with the resource.
End Using
次の例で示すように、変数の型を関数の戻り値から推論することもできます。 Process.GetProcesses
はプロセスの配列を返すため、pList1
と pList2
は両方ともプロセスの配列です。
' Using explicit typing.
Dim pList1() As Process = Process.GetProcesses()
' Using local type inference.
Dim pList2 = Process.GetProcesses()
Option Infer
Option Infer
を使用すると、特定のファイルでローカル型推論を許可するかどうかを指定できます。 このオプションを有効化またはブロックするには、次のステートメントのいずれかをファイルの先頭に入力します。
Option Infer On
Option Infer Off
コードで Option Infer
の値を指定しない場合、コンパイラの既定値は、Option Infer On
です。
ファイルの Option Infer
に設定した値が IDE またはコマンド ラインに設定した値と競合した場合は、ファイルの値が優先されます。
詳細については、「Option Infer ステートメント」および「[コンパイル] ページ、プロジェクト デザイナー (Visual Basic)」を参照してください。
関連項目
.NET