局部类型推理 (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
分类为 Object
并关闭 Option Strict
。 同理,局部类型推理不适用于声明为 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"
以下代码演示创建整数数组的两种等效方式。
' 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)。