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
。 编译器使用变量的初始值设定项在编译时确定变量的类型,以生成早期绑定的代码。 在前面的示例中,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)。