ローカル型の推論 (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
[!メモ]
前の例の num2 を Integer として型指定できない場合は、Dim num3 As Object = 3 や Dim num4 As Double = 3 のような宣言を使用して、別の型を指定できます。
ローカル型の推定は、プロシージャ レベルで適用されます。モジュール レベル (同じクラス、構造体、モジュール、インターフェイス内にあるが、プロシージャやブロックは異なる) での変数の宣言には使用できません。前の例の num2 がプロシージャのローカル変数ではなくクラスのフィールドである場合は、Option Strict がオンのときは宣言がエラーになり、Option Strict がオフのときは num2 は Object として分類されます。同様に、ローカル型推論は、Static として宣言されたプロシージャ レベルの変数には適用されません。
型の推論と遅延バインディング
型の推論を使用するコードは、遅延バインディングに依存するコードと似ています。ただし、型の推論は、変数を Object のままにするのではなく、変数の型を厳密に指定します。コンパイラは、変数の初期化子を使用してコンパイル時に変数の型を決定し、事前バインディングされたコードを生成します。前の例では、num2 は、num1 と同様に Integer として型指定されます。
事前バインディングされた変数の動作は、実行時でないと型がわからない遅延バインディングされた変数の動作とは異なります。事前に型がわかっていると、コンパイラは、実行前に問題を識別し、メモリを正確に割り当て、他の最適化を実行することができます。また、事前バインディングを使用すると、Visual Basic の統合開発環境 (IDE: Integrated Development Environment) は、オブジェクトのメンバーに関する 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 になります。Visual Basic 2008 以前からアップグレードされたプロジェクトの場合、コンパイラは既定で Option Infer Off になります。
ファイル内の Option Infer の設定値が、IDE またはコマンド ラインでの設定値と競合する場合は、ファイル内の値が優先します。
詳細については、「Option Infer ステートメント」および「[コンパイル] ページ (プロジェクト デザイナー) (Visual Basic)」を参照してください。
制約
型の推論は、静的ではないローカル変数に対してのみ使用できます。クラスのフィールド、プロパティ、または関数の型を決定するためには使用できません。
参照
関連項目
For Each...Next ステートメント (Visual Basic)
For...Next ステートメント (Visual Basic)