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
がオンのエラーが発生し、num2
がOption Strict
オフのObject
として分類されます。 同様に、ローカル型推論は、 Static
として宣言されたプロシージャ レベルの変数には適用されません。
型推論と遅延バインディング
型推論を使用するコードは、遅延バインディングに依存するコードに似ています。 ただし、型推論では、変数を Object
のままにするのではなく、厳密に型指定します。 コンパイラは、変数の初期化子を使用して、コンパイル時に変数の型を決定し、事前バインドされたコードを生成します。 前の例では、num1
と同様に、num2
は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 On
Option Infer Off
コードで Option Infer
の値を指定しない場合、コンパイラの既定値は Option Infer On
。
ファイル内の Option Infer
に設定された値が IDE またはコマンド ラインで設定された値と競合する場合、ファイル内の値が優先されます。
詳細については、「 Option Infer ステートメント と コンパイル」ページ、プロジェクト デザイナー (Visual Basic)を参照してください。
こちらも参照ください
.NET