Visual Basic 2010有哪些新的改进?

Categories: VB, Visual Studio
Tags: No Tags
Comments: 21 Comments
Published on: 2010 年 05 月 11 日

[原文作者]:Jonathan Aneja

[原文链接]:What’s New in Visual Basic 2010

Jonathan Aneja

    自1991年面世以来,Visual Basic一直都是创建项目的高效工具。大概20年后,它仍然提供调用微软.net框架的简单方法,支持开发者开发桌面、手机、浏览器甚至云程序。

    这个月微软将会发布Visual Studio 2010,它包含了Visual Basic的10版本(有时候被叫做VB2010或者VB10)。这个强大的版本包含了许多节约时间的功能,它能够帮助开发者以最少的代码做最多的事情。为了顺利的使用Visual Studio 2010里的Visual Basic,下面是所有你需要知道的。

共同改进(Coevolution)

    以前,Visual Basic和C#是由不同的组开发的,这就导致了一些功能在一种语言上比在另一种语言上先出现。比如,C#有自动属性和集合初始器,Visual Basic却没有;Visual Basic有后期绑定和可选参数这些功能,C#却没有。但是当一个新的功能出现在一种语言上时,许多客户会要求另一种语言也可以兼容这些功能。

    针对这些反馈,微软将Visual Basic和C#组合并,采用共同演化的策略,为的就是让各种语言能共同发展。当主要的功能在一种语言中被提出,它也应该出现在其他的语言当中。这并不意味着每一个功能都会在这两种语言中出现并且以同样的方式运作;事实上,每一种语言都有它自己的历史,意义和感觉——需要去维持的重要特征。共同演化意味着你能在一种语言里完成的功能在另一种语言里也同样简单实现。

    在.NET框架4里,Visual Basic和C#朝这个目标都迈出了巨大的一步,都增加了一些另一种语言已经具有的功能。然而,共同演化并不只是关于过去,它也是语言在未来的革新。从这个意义上来说,.NET框架4推出了强大的新功能,像动态语言运行时,嵌入操作类型和泛型差异,对这两种语言,Visual Basic和C#开发者可以充分利用.NET框架的优点。

Visual Basic 2010的新功能

    Visual Basic 2010的新功能是为了帮助你用更少的代码实现更多的功能。我们(Visual Basic设计组)看到开发者往往不得不写很多冗长的样板代码,调查之后我们决定让编译器去做这部分工作。这只是个蓝图,让我们一个个的深入这些功能。

隐行延续(Implicit Line Continuation)

    Visual Basic是一种面向行的语言,它使用清晰的,类似于英语的语法来提高可读性。但是,这往往导致在代码中碰到了每行80个字符的限制,迫使开发者使用鼠标滚动很多。你可以使用下划线来告诉编译器,它应把下一行作为当前行的一部分来处理(即将多个物理行作为一个单独的逻辑行来处理)。但是不得不重复的输入下划线也一直使人困扰,事实上,几年来,对编译器要求最多的功能就是解决这个问题。

然而,在Visual Basic 2010,编译器做到了。现在,哪些记号(像逗号,句号,运算符)会出现在续行字符之前,编译器都知道,并且会插入这些字符,所以开发者不用做这些了。例如,用一个逗号结束Visual Basic语句不再合法;编译器知道这些,所以当它发现一个记号看起来像逗号,回车,它就会推断续行符的存在,就像图1上的例子所示。

图1 推断续行符

<Extension()>

Function FilterByCountry(

  ByVal customers As IEnumerable(Of Customer),

  ByVal country As String) As IEnumerable(Of Customer)

    Dim query =

      From c In customers

      Where c.Country = country

      Select <Customer>

        <%=

          c.Name &

          "," &

          c.Country

        %>

      </Customer>

    Return query

  End Function

在Visual Basic 2008,图1的代码会需要9个下划线。然而,在每个这样的例子里,编译器推断在什么时候需要下划线并且允许它被省略:

· 在<Extension()>属性之后

· 在函数的声明里( (左括号)之后

· 在第一个参数,之后

· 在函数的声明里)(右括号)之前

· 在=(等号)之后

· 在<%=(嵌入表达式的开始标签)之后

· 在XML文档每个&(与符号)之后

· 在%>之前(嵌入表达式的结束标签)

如在例子中表现的一样,如果每个部分都在同一行就要超过80个字符,这个编译器新的功能,对这种方法签名尤其有用。在图2,你将会看到记号和续行符隐藏的地方的所有组合。

图2 续行符隐藏的地方

记号

之前

之后

, (逗号),  .  (点),   >  (属性),   (  {  (左括号),   <%=  (嵌入表示式的开始 (XML 字符))

 

X

),   },   ,   ]  (右括号), %> (嵌入表达式的结束)

X

 

所有的 LINQ 关键字:

Aggregate, Distinct, From, Group By, Group Join, Join, Let, Order By, Select, Skip, Skip While, Take, Take While, Where, In, Into, On, Ascending, Descending

X

X

运算符:

+ ,   – ,   * ,   / ,   \ ,   ^ ,   >> ,   << ,   Mod,   & ,   += ,   -= ,   *= ,   /= ,   \= ,   ^= ,   >>= ,   <<= ,   &= ,   < ,   <= ,   > ,   >= ,   <> ,   Is,  IsNot,  Like,  And,   Or,  Xor,  AndAlso,  OrElse

 

X

With (in an object initializer)

 

X

    
正如你看到的,有60多个地方不需要下划线。(事实上,在这片文章中,没有一个代码示例需要续行符。)当然,你仍然可以使用下划线,所以以前版本上的Visual Basic代码仍然如我们期望的兼容。

声明Lambdas表达式(Statement Lambdas)

Lambdas这个词初听起来会有点吓人,但Lambdas简单来说是定义在一个方法内的方法。Visual Basic 2008用函数关键字来介绍lambdas表达式:

Dim customers As Customer() = …

Array.FindAll(customers, Function(c) c.Country = "Canada")

Lambdas表达式提供一种相当不错的紧凑的方式去本地化表达逻辑,而不必分割成多个方法。例如,下面是之前的code在Visual Studio 2005(不支持 Lambdas表达式)里的情况:

Dim query = Array.FindAll(customers, AddressOf Filter)

    …

Function Filter(ByVal c As customer) As Boolean

  Return c.Country = "Canada"

End Function

不幸的是,Visual Studio 2008中的Lambdas表达式要求表达式返回一个值,所以:

Array.ForEach(customers, Function(c) Console.WriteLine(c.Country))

将会导致:

‘Compile error: "Expression does not produce a value."

Console.WriteLine是一个Sub过程(在C#中返回空),所以它没有返回值,这就是为什么编译器报一个错误。解决这个问题,Visual Studio 2010支持Statement Lambdas,就是可以包含一个或多个声明的Lambdas。

Array.ForEach(customers, Sub(c) Console.WriteLine(c.Country))

因为Console.WriteLine没有返回值,我们可以创建一个Sub lambdas,而不是一个Function lambdas。下面是另一个使用多个声明的例子:

Array.ForEach(customers, Sub(c)

                           Console.WriteLine("Country Name:")

                           Console.WriteLine(c.Country)

                         End Sub)

当执行这段代码,它会为每个customer打印2行,还要注意,当你在编码时悬停,你会注意到编译器已经推断出类型为Customer(键入 c As Customer来声明类型也是合法的)。动态布线事件处理是statment lambdas的另一大用途:

AddHandler b.Click, Sub(sender As Object, e As EventArgs)

                      MsgBox("Button Clicked")

                      ‘insert more complex logic here

                    End Sub

并且事实上,你可以将statement lambdas同Visual Studio 2008里提到的一个功能合并到一起:松弛委托。(你可以使用委托——类型安全的函数指针——来一次执行多个函数。)这种结合产生一种更简单的签名:

AddHandler b.Click, Sub()

                      MsgBox("Button Clicked")

                     ‘insert more complex logic here

                    End Sub

松弛委托让你从一个事件处理程序里完全省略参数——非常好的优点,这些参数频繁的提供但却从来没使用过,所以只会增加视觉噪音。

除了我们已经看到的单行Sub lambdas和多行Sub lambdas,Visual Studio 2010也支持多行Function lambdas:

Dim query = customers.Where(Function(c)

                              ‘Return only customers that have not been saved

                              ‘insert more complex logic here

                              Return c.ID = -1

                            End Function)

    另外有趣的是,Statement lambdas跟Visual Basic 2008的匿名委托采用相同的方式。人们经常把它跟C#的匿名方法混淆,但是技术上来说,他们并不一样。匿名委托适用于Visual Basic编译器推断委托类型是基于一个lambda的方法签名的时候。

Dim method = Function(product As String)

               If product = "Paper" Then

                 Return 4.5 ‘units in stock

               Else

                 Return 10 ’10 of everything else

               End If

             End Function

MsgBox(method("Paper"))

     如果你运行这段代码,你将会看到4.5显示在信息窗口上。当然,如果你悬停在这个方法上,你会看到Dim method As <Function(String) As Double>。因为我们不提供真正的委托类型,所以,编译器会自动生成一个,就像:

Delegate Function $compilerGeneratedName$(product As String) As Double

     这就叫匿名委托,因为它只出现在编译器生成的代码里,而不在自己写的代码里。事实上请注意,当没有As语句用来说明lambda的返回类型时,编译器推断返回值是Double型。编译器查看所有lambda里的返回语句,发现Doule类型(4.5)和Integer类型(10):

‘Notice the "As Single"

Dim method = Function(product As String) As Single

               If product = "Paper" Then

                 Return 4.5 ‘units in stock

               Else

                 Return 10 ’10 of everything else

               End If

             End Function

然后运行主导型算法并确定它可以安全的把10转换成Double类型,但是不能安全的将4.5转换成Integer类型,因此Double型是更好的选择。

当然如果编译器不尝试去推断类型,你也可以明确控制返回值的类型,而不是

21 Comments - Leave a comment
  1. quoted on qvod说道:

    qvod…

    […]Visual Basic 2010有哪些新的改进? « vbcti[…]…

  2. denver escorts说道:

    you know what it is!! black and yellow, haha just kidding but this is a really good blog. Keep up the nice writing. I was quite impressed!

  3. I’m impressed, I have to say. Definitely seldom do I discovered a weblog thats each informative and entertaining, and allow me to let you know, you have hit the nail on the head. Your idea is important; the issue is something that not a great deal of people today are speaking intelligently about. I’m seriously delighted that I stumbled across this in my lookup for something relating to this.

  4. top poker sites说道:

    I gotta favorite this site it seems very beneficial invaluable

  5. free psychic说道:

    I admire the dear information you offer on your articles. I can bookmark your weblog and feature my children check up here generally. I am fairly sure they’re going to be informed a variety of new stuff right here than anyone else!

  6. wonderful points altogether, you simply gained a new reader. What would you suggest in regards to your post that you made some days ago? Any positive?

  7. Yay google is my world beater assisted me to find this great website ! .

  8. That’s Too nice, when it available in india hope might make a Rocking position for youngster.. hope that come true.

  9. I found your weblog website on google and check a few of your early posts. Continue to keep up the superb operate. I just extra up your RSS feed to my MSN Information Reader. Seeking ahead to reading more from you afterward!…

  10. Jamey Norberg说道:

    Realy intesting one of the best system , thank you .

  11. excellent write up here, I couldnt have said it any better myself and I’m pretty good at writing lol

  12. :O So mush Information :O … THis Is he MOst AMAzing SIte DUDe… :D

  13. Cleo Garza说道:

    this is a great article! This is making me sleepy

  14. chicken说道:

    Thanks for writing about this. I wrote about this on my Web site as i thought it was interesting.

  15. Zoe Marshalsea说道:

    excellent insight these comments, oh these comments

  16. Carroll Yaegle说道:

    A lot of thanks for all of your efforts on this website. Kate really loves carrying out internet research and it’s easy to see why. All of us notice all about the dynamic manner you present great guidelines through this web site and cause response from people on this area of interest while our favorite princess is actually learning so much. Enjoy the remaining portion of the new year. Your performing a pretty cool job.

  17. Jules Obrecht说道:

    I simply wished to thank you so much yet again. I do not know what I would’ve followed without those suggestions documented by you relating to such a topic. This has been a very hard difficulty in my opinion, but encountering the very expert manner you processed that made me to leap for happiness. I am happier for your work and have high hopes you comprehend what an amazing job that you’re providing teaching other individuals using your site. I’m certain you have never got to know all of us.

  18. You have a great Blog here Mate. Love your content very informative, Please keep up the good work.

  19. Perry Lua说道:

    Hey 8qoubfenhnpqovq5ilmb, very interesting post, it really got me thinking. vgxzabnz26 i742141fab Thank you. w3c46a3dqc
    8gdjor4rua

Leave a comment


Welcome , today is 星期五, 2017 年 05 月 26 日