區域類型推斷 (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
,而且會將 num2
分類為 Option Strict
已關閉的 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"
下列程式碼示範兩種建立整數陣列的相等方式。
' 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}
使用型別推斷可方便您判斷迴圈控制變數的類型。 在下列程式碼中,編譯器會推斷 number
為 Integer
,因為上一個範例中的 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
您也可以從函式的傳回值推斷變數的類型,如下列範例所示。 pList1
和 pList2
都是處理序陣列,因為 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)。