區域類型推斷 (Visual Basic)

Visual Basic 編譯器會使用「型別推斷」來判斷在不使用 As 子句的情況下宣告之區域變數的資料類型。 編譯器是根據初始化運算式的類型來推斷變數的類型。 這可讓您宣告變數,而不明確指出類型,如下列範例所示。 宣告的結果是,num1num2 都與整數一樣具有強型別。

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 = 3Dim num4 As Double = 3 等宣告來指定另一個類型。

注意

型別推斷只能用於非靜態區域變數,無法用來判斷類別欄位、屬性或函式的類型。

區域型別推斷適用於程序層級。 無法用在模組層級宣告變數 (可在類別、結構、模組或介面內,但不可在程序或區塊內)。 如果上一個範例中的 num2 是類別的欄位,而不是程序中的區域變數,則宣告會導致錯誤並開啟 Option Strict,而且會將 num2 分類為 Option Strict 已關閉的 Object。 同樣地,區域型別推斷不適用於宣告為 Static 的程序層級變數。

型別推斷與晚期繫結

使用型別推斷的程式碼類似於依賴晚期繫結的程式碼。 不過,型別推斷會將變數設為強型別,而不是將其保留為 Object。 編譯器會使用變數初始設定式,在編譯時間判斷變數的類型,以產生早期繫結程式碼。 在上一個範例中,num2num1 一樣都是鍵入作為 Integer

早期繫結變數的行為與晚期繫結變數的行為不同,後者只有到執行階段才會知道類型。 提早知道類型可讓編譯器在執行之前找出問題、精確地配置記憶體,並執行其他最佳化。 早期繫結也可讓 Visual Basic 整合式開發環境 (IDE) 提供物件成員的 IntelliSense 說明。 早期繫結也有助於提升效能。 這是因為儲存在晚期繫結變數中的所有資料都必須包裝為 Object 類型,而在執行階段存取此類型的成員會使程式變慢。

範例

當區域變數在不使用 As 子句的情況下宣告並初始化時,就會發生型別推斷。 編譯器會使用指派初始值的類型作為變數的類型。 例如,下列每一行程式碼都會宣告 String 類型的變數。

' Using explicit typing.
Dim name1 As String = "Springfield"

' Using local type inference.
Dim name2 = "Springfield"

下列程式碼示範兩種建立整數陣列的相等方式。

' 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}

使用型別推斷可方便您判斷迴圈控制變數的類型。 在下列程式碼中,編譯器會推斷 numberInteger,因為上一個範例中的 someNumbers2 是整數陣列。

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

您也可以從函式的傳回值推斷變數的類型,如下列範例所示。 pList1pList2 都是處理序陣列,因為 Process.GetProcesses 會傳回處理序陣列。

' 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)

另請參閱