局部类型推理
更新: 2008 年 7 月
Visual Basic 2008 中的编译器使用类型推理来确定未使用 As 子句声明的局部变量的数据类型。编译器将通过初始化表达式的类型推断出变量的类型。这使您可以声明变量,而无需显式声明类型,如下面的示例中所示。
Public Sub inferenceExample()
' Using explicit typing.
Dim num1 As Integer = 3
' Using local type inference.
Dim num2 = 3
End Sub
说明: |
---|
局部类型推理不能用于声明类字段。如果上面示例中的 num2 是字段而不是局部变量,则在 Option Strict 打开时该声明会导致错误,而在 Option Strict 关闭时该声明会将 num2 分类为 Object。同样,在 Option Strict 打开时,无法推断出静态变量的类型。在 Option Strict 关闭时,Static staticVar = 5 中的 staticVar 的类型为 Object。 |
使用类型推理的代码类似于依赖后期绑定的代码。但是,类型推理可将变量设置为强类型,而不是使变量保留为 Object。编译器使用变量的初始值设定项,在编译时确定变量的类型,以生成早期绑定代码。在前面的示例中,num2 被类型化为 Integer。
早期绑定变量的行为与后期绑定变量的行为不同,只有在运行时才知道后期绑定变量的类型。在早期知道类型,使得编译器可以在执行之前确定问题,准确地分配内存,并且执行其他优化。早期绑定还使 Visual Basic 集成开发环境 (IDE) 可以提供有关对象的成员的 IntelliSense 帮助。早期绑定还可有利于达到更高的性能。这是因为存储在后期绑定变量中的所有数据都必须包装为类型 Object,在运行时访问该类型的成员,会使得程序运行较慢。
说明: |
---|
如果不希望前面示例中的 num2 类型化为 Integer,则可以使用声明(如 Dim num3 As Object = 3 或 Dim num4 As Double = 3)指定另一个类型。 |
示例
当局部变量未使用 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 均为进程列表。
' 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 指定值,则对于在 Visual Basic 2008 中创建的项目,编译器的默认值为 Option Infer On,而对于从较早版本升级的项目,编译器的默认值则为 Option Infer Off。有关更多信息,请参见 Option Infer 语句和 /optioninfer。
说明: |
---|
如果在文件中为 Option Infer 设置的值与 IDE 或命令行中设置的值发生冲突,则文件中的值优先。 |
限制
类型推理只能用于非静态局部变量;而不能用于确定类字段、属性或函数的类型。
请参见
概念
参考
For Each...Next 语句 (Visual Basic)
修订记录
日期 |
修订记录 |
原因 |
---|---|---|
2008 年 7 月 |
将“示例”一节文本中的循环控制变量的名称从 num 更改为 number,以匹配代码中的名称。 |
客户反馈。 |