关于Visual Basic 10.0
随着VS2010早期CTP的放出,大家对下一代开发系统的期待热情又一次掀起了。除了已经开始被大家尝鲜的C#4以外,Visual Basic也进化成了10.0。不过据我观察,VB10的改变还没有C#4那么明朗,我们目前的确可以看到一些语法上的变化,然而似乎VB10并未真正接近完工的地步,还有很多特性有待继续开发。大家也许还记得VB9引入的令人眼前一亮的XML集成语法,使得VB拥有了业界最为紧密的XML集成。但VB需要编译才能使用,这一点阻碍了VB强大的XML处理能力和动态能力,如果VB变成一个完全动态的编程语言,包括脚本化运行的能力,那么VB使用方便的特点将再一次发挥出来。但是VS2010 CTP中尚未看到基于新DLR的VB编译器。我们能看到的仍然是一个静态编译的VB10。所以我这次主要介绍一下VB语法方面的改进,更多改进等到VS2010来临之际自然会知晓。
1. 隐式续行符
用过VB的人都知道VB的语句是写成一行一行的,无需分号隔离。一般情况下语句只能写成一行,不能换行。而从VB5.0开始,如果觉得语句写成一行太长,可以加入续行符(line continuation)来换行。比如说:
<HideModuleName()> _ Module Module1 <STAThread()> _ Sub Main() Dim message = "Your directory is" & _ Environment.CurrentDirectory() Dim l As New List(Of Integer) Dim r = From item In l _ Where item > 0 AndAlso item < 100 _ Select Number = item.ToString() End Sub Function Foo(ByVal x As Integer, _ ByVal y As String, _ ByVal z As Double) As Single End Function End Module |
我们可以看到这段代码中多处出现了续行符(就是一个空格加一个下划线)。无论是Attribute应用语法,还是表达式、Linq表达式或函数签名,都必须用续行符来换行。
首先我们说换行并非必须,而仅仅是为了美观。像Linq这样的语法出现之后,换行书写就成了很多人的迫切需要。因此VB10改进了语法,引入了隐式换行符的概念。当VB能够判断一行语法未完的上下文,就会自动将紧接的一行视为续行,而无需显示加入续行符。这样一来在常见的场合,你就可以任意换行,充分发扬Basic语言的自由风格了:
<HideModuleName()> Module Module1 <STAThread()> Sub Main() Dim message = "Your directory is" & Environment.CurrentDirectory() Dim l As New List(Of Integer) Dim r = From item In l Where item > 0 AndAlso item < 100 Select Number = item.ToString() End Sub Function Foo(ByVal x As Integer, ByVal y As String, ByVal z As Double) As Single End Function End Module |
这样一来清爽多了。不过隐式续行符和显式续行符一样,有个小小的缺陷,就是不能在后面插入注释。据说这是VB IDE团队过分依赖于此特性,以至于超多历史代码无法一一改变造成的……
2. 多行Lambda表达式和方法型Lambda表达式
VB2008为了支持Linq已经引入了Lambda表达式的概念。但VB2008的Lambda表达式有局限性,只能是函数形态(必须有返回值),同时最多只能含有一个表达式,所以无法加入多行语句。虽然函数式编程仅支持一行语句也可编写,但若能支持多行语句就能扩大与VB传统语法的结合能力。比如说可以用在PLinq等场合。语法非常简单,就如同是将Sub和Function写在了方法体内部一样:
Dim f = Function(x) x + 1 '函数形态Lambda Dim g = Sub(x) Console.WriteLine(x) '方法形态Lambda Dim h = Function(x, y) '多行语句函数 Dim z = x`+ y Return 2 * Math.Squr(Z) End Function Dim i = Sub() '多行语句子程序 f(1) g(2) h(3, 4) End Sub |
多行Lambda和语句型Lambda都可以捕获局部变量,完成函数式的诸多算法。他们同样也基于匿名委托工作。有了此工具,就可以更有效地在VB中进行函数式风格的编程了。
3. 数组、集合和字典的初始化语句。
这个新特性是VB9日程过于紧迫而被砍掉的特性,其实和C#的类似功能是一样的。首先,VB10引入了一个纯粹的数组字面量。无需任何修饰,下列语法就表示一个强类型数组:
{1, 2, 3, 4} |
编译器会自动推测它是Integer类型的数组。这个表达式不仅仅可以用于赋值,还可以直接出现在需要数组的上下文中。这是个很好的特性,基于一些Linq操作,VB也可以像函数式语言操作“表”一样,在数组上进行一些眼花缭乱的算法了。同时,List(Of T)和Dictionary(Of TKey, TValue)类型也可以用类似的表达式初始化。暂定关键字为From:
Dim l As New List(Of Integer) From {1, 2, 3, 4} Dim d As New Dictionary(Of String, Double) From {{"A", 1}, {"B", 2}} |
其实我个人感觉字典的初始化语法应该像JSON语法那样才好。。。
4. 泛型接口和泛型委托的协变、反变性
我们都知道.NET泛型是不允许任何形式的协变或反变的。也就是说Foo(Of T)是不可能转成Foo(Of U)的,不管T和U之间有什么样的关系。用过Java泛型的人可能会对此表示疑问。但其实仔细一想不难发现,泛型参数T在这个类型中如何被使用我们是不能加以约束的。因此T既可能出现在成员函数的参数上,也可能出现在返回值上。因此允许协变必然会导致某种类型不安全的现象发生。现在CLR增加了一种新的描述泛型类型参数的方法,可以限定类型参数只能用于方法的参数或返回值。这样就使得安全的协变成为可能。VB10为此提供了两种语法(仅能用于声明泛型接口和泛型委托,不能用于泛型类或泛型方法):
Interface IFoo(Of In T) Sub Foo(ByVal x As T) End Interface Interface IBar(Of Out T) Function Bar() As T End Interface |
其中被In修饰的泛型类型参数仅能在接口或委托中用于函数的参数类型,而被Out修饰的泛型类型参数则只能用于返回值类型。
加上这样的修饰之后,该接口就允许某些条件下的协变或反变了。首先,IFoo(Of In T)将可以反变成IFoo(Of In U),当且仅当U继承自T。比方说IComparable(Of Object)将能够反变成IComparable(Of String)。因为IComparable(Of In T)拥有In的修饰。接下来IBar(Of Out T)也将可以协变成IBar(Of Out U),当且仅当T继承自U。比如IEnumerable(Of String)将能够协变成IEnumerable(Of Object)。注意达成协变和反变的条件仅仅是继承关系,而且必须都是引用类型。值类型泛型和引用类型泛型因为有不同的JIT已构建类型(Constructed Type),所以是不能运行时协变的。
综上所述,VB10目前放出来的主要改进就是一些语法方面的完善工作。VB从很久以前就已经为动态大潮做好了准备,C#4的大部分新特性(例如dynamic,可选参数,命名参数)全部都是10年前VB就已经拥有的。现在VB将传统的动态能力与新的DLR结合在一起,加上XML语法的卓越威力,必将成为.NET 4时代重要的动态语言。后续新特性,待官方发布后将继续研究和报道。
转载于:https://www.cnblogs.com/Ninputer/archive/2008/11/03/vb10firstlook.html
关于Visual Basic 10.0相关推荐
- Visual Basic 6.0安装说明
一.软件简介: Visual Basic(简称VB)是Microsoft公司开发的一种通用的基于对象的程序设计语言,为结构化的.模块化的.面向对象的.包含协助开发环境的事件驱动为机制的可视化程序设计语 ...
- 将Visual Basic 6.0程序转换到Visual Basic.NET
从 Visual Basic 6.0 到 Visual Basic.NET 的转换 Microsoft Visual Basic.NET 是 Microsoft Visual Basic© 的后续版本 ...
- Visual Basic 9.0 前沿播报·静态篇(一)局部变量类型推测和数组初始化器
不要惊讶,每个PDC上都会有微软最新产品的前瞻,所以在Visual Basic 2005发布以前看到Visual Basic 9.0的消息就是可以理解的了.Visual Basic 9.0 (code ...
- 又一次的Microsoft Visual C++ 10.0 is required (Unable to find vcvarsall.bat)
~~~~~~~~~~~My problem is here~~~~~~~~~~~~~~~~~~~~~~ Error: Microsoft visual C++ 10.0 is required (un ...
- 老树新芽 体验Visual Basic 9.0新功能
前言 "Visual Basic code-named Orcas"(Visual Basic 9.0)对基于"Visual Basic code-named Whidb ...
- Visual Basic 6.0编写简单网页浏览器
打开Visual Basic 6.0开发工具,新建一个标准EXE工程. 右击工具箱,选择部件,在列表中选择Microsoft Internet Controls并单击确定. 在Form1窗体上添加一个 ...
- Visual Basic 6.0.with.SP6 龙卷风大企业集成安装版(含下载地址)
Visual Basic 6.0.with.SP6 龙卷风大企业集成安装版(含下载地址) 下载地址:ftp://11111:51ct.cn@soft.51ct.cn/VB6SP6.rar 以下为引用: ...
- VS2008系列培训教程之四:What's new in C# 3.0 Visual Basic 9.0
这篇文章是参考微软内部文档重新编写而成,感谢相关内容的各位作者的辛勤劳动! 其内容介绍如下: During this brief session, you will learn about some ...
- Visual Basic 6.0 中文企业版
Visual Basic6是现阶段最多人使用的一款Basic编程软件,Visual Basic又被称作VB,是很多软件工程学生必学的课程之一,通过Visual Basic用户可以轻松的制作出软件窗口, ...
最新文章
- 简书=鸡汤?爬取今日看点数据:1916篇简书热门文章可视化
- 欢乐纪中某B组赛【2019.1.18】
- 腾讯和阿里巴巴考虑互相开放生态,是真开放还是新的垄断?
- 浅析MySQL二进制日志
- Spring MVC Controller 的同一个 URL 请求,根据逻辑判断返回 JSON 或者 HTML 视图
- 微信公众平台消息接口开发(34)微信墙之表白墙/婚礼墙/晚会墙/会议墙/晒单墙/照片墙/历史墙...
- BicycleGAN详解与实现
- javap命令生成native需要的签名
- 【ArcGIS|空间分析|网络分析】0 网络分析总结
- xp计算机共享能否指定用户,XP怎么设置局域网共享?
- cad直线和圆弧倒角不相切_在cad绘制倒圆角的方法技巧步骤详解
- 10000+TB 阿里网盘资源!够过年了吧?
- 毕业设计 - 题目:基于FP-Growth的新闻挖掘算法系统的设计与实现
- 百度文件下载慢怎么办?~教你百度网盘无需VIP离线下载大文件
- 连续词袋模型(Continous bag of words, CBOW)
- 远程控制桌面计算机怎么填写,远程控制电脑桌面如何操作【图解】
- [hihoCoder#1065]全图传送
- pip3 install XXX加快下载速度
- 中国城市竞争力排名出炉
- java邮箱和手机正则表达式
热门文章
- 计算机图形学多边形填充代码_零基础学计算机图形学太难?或许你缺的只是一本好书...
- 如何用RHEL System Role把Postfix安装和配置自动化?
- 业内首款云原生技术中台产品云原生 Stack 来了!
- KubeNode:阿里巴巴云原生 容器基础设施运维实践
- ai外呼营销系统_郑州专业智能营销系统开发,外呼电话线路好用吗-有效!-「线路稳定 不封号」...
- 工作流activity_开源、强大的工作流引擎:camunda入门介绍
- mysql 普通索引使用方法,Mysql索引类型与基本用法实例分析
- DeepLearning:环境配置(cuda+cudnn)
- Python之web开发(六):python使用django框架搭建网站之登陆页搭建不同页面之间跳转
- 【每周CV论文】初学深度学习图像修复应该要读的文章