局部类型推理 (Visual Basic)

Visual Studio 2013
 
其他版本
 

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 打开时该声明会导致错误,而在 Option Strict 关闭时该声明会将 num2 分类为 Object。 类似,局部类型推理不应用于声明为 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 On

Option Infer Off

如果没有在代码中指定 Option Infer 的值,则编译器默认为 Option Infer On。 对于从 Visual Basic 2008 或早期版本升级的项目,编译器默认为 Option Infer Off。

如果在文件中为 Option Infer 设置的值与 IDE 或命令行中设置的值发生冲突,则文件中的值优先。

有关更多信息,请参见 Option Infer 语句“项目设计器”->“编译”页 (Visual Basic)

限制

 

类型推理只能用于非静态局部变量;而不能用于确定类字段、属性或函数的类型。

vb小菜一枚-----了解“类型推理”的更多相关文章

  1. vb小菜一枚--------早期绑定和后期绑定

    早期绑定和后期绑定 Visual Studio 2005   其他版本   将对象分配给对象变量时,Visual Basic 编译器会执行一个名为 binding 的进程.如果将对象分配给声明为特定对 ...

  2. [VB.NET Tips]创建匿名类型列表

    在调用一些Web API时经常要发送或接收一些数据,在构造Json时可能要创建一些类. 很多都是在调用相关方法才使用到这些类,那使用匿名类型是个不错的选择.如果要传些表结构数据时,就要创建List. ...

  3. (转载)VB 查询Oracle中blob类型字段,并且把blob中的图片以流的方式显示在Image上

    原文摘自:http://heisetoufa.iteye.com/blog/ '模块代码 Private Declare Function CreateStreamOnHGlobal Lib &quo ...

  4. Go语言之旅:基本类型

    原文地址:https://learn-linux.readthedocs.io 欢迎关注我们的公众号:小菜学编程 (coding-fan) Go 内置了以下基本类型: 布尔 bool 字符串 stri ...

  5. VB中的API详解

    一.API是什么? 这个我本来不想说的,不过也许你知道其它人不知道,这里为了照顾一下新手,不得不说些废话,请大家谅解. Win32 API即为Microsoft 32位平台的应用程序编程接口(Appl ...

  6. Swift 集合类型

     Swift语言提供数组和字典的集合类型  Swift 语言里的数组和字典中存储的数据值类型必须明确 ,即数组中只能存放同类型的数据. 1: 数组 数组的创建 var shoppingList: St ...

  7. [CLR via C#]15. 枚举类型和位标志

    一.枚举类型 枚举类型(enumerated types)定义了一组"符号名称/值"配对. 例如,以下Color类型定义了一组符号,每个符号都标识一种颜色: internal en ...

  8. (旧)子数涵数·VB——变量

    最近,VB吧频繁出现如下图所示的帖子(现在C吧.VB吧等都已经被二级考生玩坏了) 这主要用到的是变量的概念 首先,我们来看一下变量的数据类型 当然,就这题而言,数据类型不是重点,主要考察的是变量的作用 ...

  9. C++ 函数模板的返回类型如何确定?

    函数模板 #include <iostream> // 多个参数的函数木板 template<typename T1, typename T2> T2 max(T1 a, T2 ...

随机推荐

  1. AWT事件处理

    AWT事件处理基本概念 AWT事件处理过程中,主要涉及3类对象: ①   Event(事件):用户对组件的一个操作,称之为一个事件,以类的形式出现,例如,键盘操作对应的事件类是KeyEvent.其实例 ...

  2. 用shell在一个文件后面的每一行追加数据

    在shell分析log的时候,需要将数据过滤后转为csv的格式: 要在分析好的数据后面追加逗号: sed 's/$/&,/g' no2.log > ccc.log 结果保存在ccc.lo ...

  3. myeclipse 手动安装 lombok

    1. 将 lombok.jar 复制到 myeclipse.ini / eclipse.ini 所在的文件夹目录下    2. 打开 eclipse.ini / myeclipse.ini,在最后面插 ...

  4. 关于一个程序的编译过程 zkjg面试

    http://blog.csdn.net/gengyichao/article/details/6544266 一 以下是C程序一般的编译过程: 从图中看到: 将编写的一个c程序(源代码 )转换成可以 ...

  5. Windows 10通过本地镜像离线安装.NET 3.5

    在Windows10中,当我们安装某些软件的时候会提示"你的电脑上的应用需要使用以下Windows功能:.NET Framework 3.5(包括.NET 2.0和3.0)",由于 ...

  6. 发送短信MFMessageComposeViewController

    if([MFMessageComposeViewController canSendText]) { MFMessageComposeViewController * controller = [[M ...

  7. 应用程序缓存--manifest

    应用程序缓存(Application Cache)为应用带来三个优势: 离线浏览 - 用户可在应用离线时使用它们 速度 - 已缓存资源加载得更快 减少服务器负载 - 浏览器将只从服务器下载更新过或更改 ...

  8. OPENQUERY 无行返回 无数据返回 数据缺失

    用SQL Server 2008 R2 的 Oracle Provider for OLE DB 链接Oracle . 在SQL Server中使用下面查询语句,没有数据返回 但是再PL/SQL中查找 ...

  9. 使用jekyll在GitHub Pages上搭建个人博客【转】

    网上有不少资源,但大多是“授人以鱼”,文中一步一步的告诉你怎么做,却没有解释为什么,以及他是如何知道的.他们默认着你知道种种专业名词的含义,默认着你掌握着特定技能.你折腾半天,查资料,看教程,一步步下 ...

  10. hash 表 | | jzoj 1335 | | 脑残+手残 | | 集合的关系

    给定两个集合A.B,集合内的任一元素x满足1 ≤ x ≤ 10^9,并且每个集合的元素个数不大于10^5.我们希望求出A.B之间的关系. 给定两个集合的描述,判断它们满足下列关系的哪一种:A是B的一个 ...