写点什么

Visual Basic 11 新特性一览

  • 2012-03-11
  • 本文字数:1432 字

    阅读完需:约 5 分钟

Visual Basic 11 推出了一些新特性,其中包括异步函数和期待已有的迭代器。

Visual Basic 中的异步支持与 C#中的版本一样。两者均使用相同的设计和关键字(即 Async 和 Await),并且背后支撑这些关键字的都是.NET 4.0 引入的任务并行库(Task Parallel Library)。

尽管异步函数从理论上来说可以在任意地方使用,但是其主要目的还是为了防止敏感线程(sensitive thread)发生阻塞,例如,你可以在 WPF 或 Silverlight 应用程序的 UI 线程中使用异步函数进行文件操作、服务调用或数据库请求。异步操作完成后会自动回归 UI 线程,而不会在此期间造成阻塞。

ASP.NET 线程池中的线程是另一个敏感线程的例子。一般情况下,ASP.NET 会限制并发线程的数量,以防止过多的上下文切换导致性能退化。这个数量通常会设置成一个任意的基数,而后当运行时(Runtime)检测到大量阻塞时再进行增长。若改用异步、非阻塞调用,系统运行将更接近于理想的“one thread-per-core”模型。

Visual Basic 11 同时支持迭代器函数(iterator function)和迭代器块(iterator block)。其中迭代器函数类似于 C#中的迭代器,只是语法稍有改动。在 VB 中,迭代器函数必须被声明为“Iterator Function”而不仅是“Function”关键字。VB 开发人员使用“Yield [expression]”来返回结果值,这与 C#中使用“yield return [expression]”不一样。

VB & C#语言组程序经理 Anthony Green 谈到:

Iterator 关键字虽然使我们避免了对那些使用 Yield 作为标识符(如金融相关的应用程序)的现存源文件造成破坏,虽然为我们提供了一个简洁的 Yield 关键字而非关键字对 Yield Return,但这些并不是它出现的唯一原因。一般情况下,VB 都会有一种声明风格(如 XML literal、Handle 和 Implement)。我们认为,VB 中的代码应当可以“顾名思义”,即如果一个函数是迭代器函数,那么代码就应当写明这点。当然,如果人们就把他们当做 Iterator 和 Async 函数调用,其实也能够运行。你可以从 VB 其他修饰符,如 ReadOnly 和 WriteOnly 属性中看到这种模式——如果属性没有 Setter 部分,那么从语义上就意味着它是 ReadOnly,从而在声明时就可以为属性加上 ReadOnly 修饰符。

显式声明修饰符的另一个好处在于,我们可以提供一个更好的编辑器体验。在 VB 中,当你键入“Iterator Function F As Integer”时,IDE 会自动为你插入“IEnumerable(Of Integer)”。类似地,如果你键入“Async Function F As Integer”,IDE 会为你将“As Integer”替换成“As Task(Of Integer)”。这就像为属性添加 ReadOnly 修饰符一样,我们可以借助这些信息自动生成更优质的代码。

有趣的是,VB11 还支持一种 lambda 表达式——迭代器块。下面的例子使用 lambda 表达式创建“IEnumerable(Of Integer)”对象并对其进行遍历。迭代器块还可以通过在“End Function”行结束后附加“.Invoke()”用在 XML literal 中。

同 C#一样,Visual Basic 11 也支持 CallerMemberName、CallerLineNumber 和 CallerFilePath 特性。在应用这些特性之后,编译器会自动计算出行号、文件路径等值,并将它们作为可选参数进行传递。这些特性用得最多的两处地方是日志记录和属性变更通知事件。

VB11 中的其他改进包括:

  • 引入 Global 命名空间,用于代码生成;
  • 为重载函数加入可选参数,支持部分向后兼容;
  • 消除方法签名中的 ByVal 关键字。IDE 自动添加 ByVal 关键字最初是因为 Visual Basic 7 将默认传值方式由引用传递变为值传递。

查看英文原文: http://www.infoq.com/news/2012/03/VB-11

2012-03-11 23:354134
用户头像

发布了 125 篇内容, 共 42.1 次阅读, 收获喜欢 5 次。

关注

评论

发布
暂无评论
发现更多内容

小谈startup类ConfigureServices方法的作用

喵叔

11月日更

EasyRecovery,重新找寻丢失的文件

淋雨

EasyRecovery

深入学习SAP UI5框架代码系列之八:谈谈 SAP UI5 的视图控件 ID,以及 SAP UI5 视图和 Angular 视图的异同

汪子熙

JavaScript 大前端 SAP UI5 签约计划第二季 技术专题合集

小程序电商微服务拆分和框架选择

云里雾花

Linux安装mysql

犟马骝

深入学习 SAP UI5 框架代码系列 | 内容合集

汪子熙

JavaScript SAP 内容合集 签约计划第二季 技术专题合集

视野数科借助 SAE + Jenkins 打造云原生 DevOps,运维效率提升 60%!

阿里巴巴云原生

阿里云 Serverless DevOps 云原生 SAE

模块五作业

doublechun

「架构实战营」

复盘最近遇到的几个问题

李印

编码习惯 经验总结

Flutter 中的手势【Flutter 专题10】

坚果

flutter 签约计划第二季

盘点Flutter领域的点点滴滴 【专题合集】

坚果

flutter 内容合集 签约计划第二季 技术专题合集

深入学习 SAP UI5 框架代码系列之四:SAP UI5 控件的元数据实现

汪子熙

JavaScript SAP UI5 签约计划第二季 WebIDE 技术专题合集

会日语的开发工程师看过来~

马农驾驾驾

Java c++ php .net 日语

不改一行代码,轻松拥有企业级微服务治理|MSE微服务治理专业版重磅发布

阿里巴巴云原生

阿里云 云原生 微服务治理 MSE

音视频理论(1)- 音频格式之 Monkeys Audio(APE)

liuzhen007

签约计划第二季

CloudPosse 的 Terraform 最佳实践

大可不加冰

DevOps 基础设施即代码 IaC Terraform HashiCorp

深入学习 SAP UI5 框架代码系列之一:UI5 Module 的懒加载机制

汪子熙

JavaScript SAP 签约计划第二季 ui5 技术专题合集

新成就!OceanBase 入选 Forrester 首份分布式数据库报告

OceanBase 数据库

数据库 开源 新闻 oceanbase 荣誉

Redis持久化策略——RDB

蝉沐风

redis redis持久化 rdb RDB 快照

Exchange漏洞分析:SSRF RCE

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 安全漏洞

深入学习 SAP UI5 框架代码系列之五:SAP UI5 控件的实例数据修改和读取逻辑

汪子熙

JavaScript SAP UI5 签约计划第二季 控件 技术专题合集

CPU的流水线指令设计

JavaEdge

工业3D视觉,为智能制造打开新视域

脑极体

Flutter自定义日历【Flutter 专题 11】

坚果

flutter 签约计划第二季

Flutter 2.5 的新特性【Flutter专题12】

坚果

flutter 签约计划第二季

畅聊分布式体系架构

吴脑的键客

分布式架构

深入学习 SAP UI5 框架代码系列之六:SAP UI5 控件数据绑定的实现原理

汪子熙

JavaScript SAP SAP UI5 签约计划第二季 技术专题合集

深入学习 SAP UI5 框架代码系列之七:控件数据绑定的三种模式 - One Way, Two Way 和 OneTime 实现原理比较

汪子熙

JavaScript 数据绑定 SAP UI5 签约计划第二季 技术专题合集

深入学习 SAP UI5 框架代码系列之二:UI5 控件的渲染器

汪子熙

SAP 签约计划第二季 ui5 渲染器 技术专题合集

深入学习 SAP UI5 框架代码系列之三:HTML 原生事件 VS UI5 Semantic 事件

汪子熙

JavaScript SAP 签约计划第二季 HTML原生事件 技术专题合集

【死磕Java并发】-----J.U.C之Condition

chenssy

11月日更 死磕 Java 死磕 Java 并发

Visual Basic 11新特性一览_IDE_Jonathan Allen_InfoQ精选文章