vb小菜一枚-----了解“类型推理”

局部类型推理 (Visual Basic)

Visual Studio 2013

其他版本

Visual Basic 编译器使用类型推理来确定未使用 As 子句声明的局部变量的数据类型。 编译器将通过初始化表达式的类型推断出变量的类型。 这使您可以声明变量,而无需显式声明类型,如下面的示例中所示。声明的结果是,num1 和 num2 都被强类型化为整数。

VB

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 类型的变量。

VB

‘ Using explicit typing. 
Dim name1 As String = "Springfield" 

‘ Using local type inference. 
Dim name2 = "Springfield"

下面的代码演示创建一个整数数组的两种等效方式。

VB

‘ 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 是一个整数数组。

VB

Dim total = 0
For Each number In someNumbers2
    total += number
Next

可以在 Using 语句中使用局部类型推理来确定资源名称的类型,如下面的示例所示。

VB

Using proc = New System.Diagnostics.Process
    ‘ Insert code to work with the resource. 
End Using

还可以从函数的返回值推断变量的类型,如下面的示例所示。 pList1 和 pList2 都是进程数组,因为 Process.GetProcesses 返回进程数组。

VB

‘ 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。 对于从 Visual Basic 2008 或早期版本升级的项目,编译器默认为 Option Infer Off。

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

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

限制

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

时间: 2024-12-18 12:38:15

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

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

早期绑定和后期绑定 Visual Studio 2005 其他版本 将对象分配给对象变量时,Visual Basic 编译器会执行一个名为 binding 的进程.如果将对象分配给声明为特定对象类型的变量,则该对象为“早期绑定”.早期绑定对象允许编译器在应用程序执行前分配内存以及执行其他优化.例如,下面的代码片段将一个变量声明为 FileStream 类型: VB ' Create a variable to hold a new object. Dim FS As System.IO.File

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

原文摘自:http://heisetoufa.iteye.com/blog/504068 '模块代码 Private Declare Function CreateStreamOnHGlobal Lib "ole32" (ByVal hGlobal As Long, ByVal fDeleteOnRelease As Long, ppstm As Any) As Long Private Declare Function OleLoadPicture Lib "olepro3

Excel开发学习笔记:VB.net的一些杂项

最近遇到一个数据处理自动化的问题,于是打算开发一个基于excel的小工具.在业余时间一边自学一边实践,最近终于完成了雏形.抽空把一些知识写下来以备今后参考,因为走的是盲人摸象的野路子,幼稚与错误请多包涵. 开发环境基于VSTO,具体配置:visual studio 2010,VB .Net,excel 2007,文档级别的定制程序. 动态数组vb自带的简单数组增删元素和改变大小不方便,.net提供的List类型很好用.比如下面定义了int类型的动态数组,第二句则是将 List(T) 的元素复制到

子数涵数·VB——变量

最近,VB吧频繁出现如下图所示的帖子(现在C吧.VB吧等都已经被二级考生玩坏了) 这主要用到的是变量的概念 首先,我们来看一下变量的数据类型 当然,就这题而言,数据类型不是重点,主要考察的是变量的作用域 Dim在模块顶部声明时,即在过程外声明时,为模块变量,而不是局部变量:此时它的作用域为模块级别,即在整个模块中皆可使用. Static与Dim的区别:用static声明的变量为静态变量,其存在时间较其作用域更久,即在程序运行时,用static声明的变量会一直存在,而用Dim声明的变量只在过程中存

6.6 类型推断

我们曾经讨论过值的类型推断,知道在 C# 3.0 中用 var 关键字,在 F#中用 let 绑定.从本节开始,我们将讨论由 C# 和 F# 共有的另一个方面,当在 C# 中调用泛型方法时,如 Option.Some(清单 5.9)或 Option.Map(清单 6.13),可以显式指定类型参数值,像这样: var dt = Option.Some<DateTime>(DateTime.Now); var nt = dt.Map<DateTime, int>(d=> d.Ye

vb,我想对你说,垃圾

最近做一个项目是vb方面的,vb6.0写的程序,除了分析底层,也写了程序,觉得vb确实不靠谱.vb写小程序还是可能.计算量一大,就不行了. vb解析型语言效率低,用了很多msvbvm函数,不停地穿越到vbvm虚拟机函数,效率很低,比如for循环,就用了__vbaVarForInit初始化for循环和__vbaVarForNext更新循环变量因子,不过这个没什么,就是效率低一点吧.我用vb写了一个循环计算,运行一两次没问题,运行了多次以后,循环因子已经走到结束了,可是没有更新,继续不断循环,结果导

vb.net与vb的区别

本文链接:https://blog.csdn.net/dfshsdr/article/details/63255645最近接触了vb.net,它增加了vb的很多特性,而且演化成为完全面向对象的编程语言.下面就来对比一下,它和vb的一些区别. 一.vb.net  完全符合面向对象的编程语言抽象.封装.继承的四大特性,而vb不支持继承. 二.错误处理 vb中只是On Error.....goto和On Errer Resume Next ,这些错误称为非结构化异常处理.而在vb.net中采用的结构化

Visual Studio 2017 发布

https://www.visualstudio.com/zh-cn/news/releasenotes/vs2017-relnotes 发布日期:2017 年 3 月 7 日 摘要 开发:快速导航.编写并修复代码 新的安装体验 - 降低了最小内存需求量以实现更快.更定制化的安装,并且支持脱机安装. Visual Studio IDE - 大幅改进了 Visual Studio 2017,包括减少启动和解决方案加载时间.改进登录和标识.改进代码导航以及增添打开文件视图和链接的服务,实现了应用和任

入侵者已经拿到了主机的管理员权限,请你列举几种留后门的方法:(windows和LINUX系统均可)

Webshell后门 XSS后门 远控后门&rootit(windows&LINUX) SSH后门 SHIFT终端服务器后门 系统用户账号克隆 SQL数据库扩展存储型后门 SQL数据库沙盒模式后门 Oralce/mysql自定义函数 Oralce的特权用户 文件捆绑型后门 下载系统用户密码HASH到本地进行破解 IIS/Tomcat/WEBLOGIC/APACHE应用型后门 键盘记录 .... 后面的继续,HEHE 收藏感谢(0) 分享到:0 32 个回复 1#哲璇 (<小学结业生&