|
<p >选择一种编程语言是每一个程序员都要做的个人决定。这就好像对冰淇淋口味的选择一样。冰淇淋口味的选择多多,但你最喜欢的口味只关系到你的个人偏好。<p >在Visual Studio 2010种,为了给程序员提供他们构建出色软件时所需要的所有工具而不用局限于他们所选择的语言,我们从好几个方面增强了我们最流行的两种语言,Visual Basic和C#语言的功能。<p ><b>Visual Basic</b><p >Visual Basic开发团队为了让开发人员可以用更少的代码完成更多的任务,集中增加了和生产力相关的功能特性。Visual Basic客户最常提出的要求是在大多数情况下能省去为代码声明分成多行时所需要添加的下划线(“_”)。Visual Basic 10增加了隐式断行的功能特性,能在大多数情况下不要求开发人员使用下划线来断行。<p ><LEFT><ccid_nobr><table width="400" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code" ><pre><ccid_code>Function Filter( ByVal customers As List ( Of Customer), ByVal orderCount As Integer ) Dim query = From c In customers Where c.Orders.Count > orderCount Select c</ccid_code></pre></td></tr></table></ccid_nobr></LEFT><p >另一个新添加的和提高生产力有关的功能特性是自动实现属性。有了自动实现属性的功能,多行常规的属性实现的代码就可以用一行简单的声明代替。在加入该功能特性之前,属性声明经常如下所示:<p ><LEFT><ccid_nobr><table width="400" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code" ><pre><ccid_code>rivate _FavoriteFlavor As String = "Butter Pecan" Property FavoriteFlavor() As String Get Return _FavoriteFlavor End Get Set(ByVal value As String) _FavoriteFlavor = value End Set End Property Private _FlavorList As New List(Of Flavor) Property FlavorList() As List(Of Flavor) Get Return _FlavorList End Get Set(ByVal value As String) _FlavorList = value End Set End Property</ccid_code></pre></td></tr></table></ccid_nobr></LEFT><p >现在,属性声明能用简单的多得方法实现:<p ><LEFT><ccid_nobr><table width="400" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code" ><pre><ccid_code>roperty FavoriteFlavor As String = "Butter Pecan" Property FlavorList As New List(Of Flavor)</ccid_code></pre></td></tr></table></ccid_nobr></LEFT><p >集合初始化和数组Literal也变得更加简单。现在集合能在它们被声明的时候就被初始化,而数组Literal的类型能交由编译器来识别。<p ><LEFT><ccid_nobr><table width="400" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code" ><pre><ccid_code>Dim toppings = New List(OfString) From { "sprinkles", "chocolate chips", "strawberries" } Dim cones = {"sugar cone", "waffle cone"} 'String()的类型被编译器识别出来</ccid_code></pre></td></tr></table></ccid_nobr></LEFT><p >现在,Visual Basic 10.0有了更好的lambda表达式支持。现在,Lambda表达式可以包含没有返回值的表达式,就像下面sub关键词所要表达的那样:<p ><LEFT><ccid_nobr><table width="400" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code" ><pre><ccid_code>Array.ForEach(toppings, Sub(n) Console.WriteLine(n))</ccid_code></pre></td></tr></table></ccid_nobr></LEFT><p >有时候,你会想在Lamdba表达式声明中作些更复杂的工作。Visual Basic 10.0支持多行的Lamdba表达式。就像在常规Lambda表达式中一样,编译器将尽可能识别变量和返回类型。<p ><LEFT><ccid_nobr><table width="400" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code" ><pre><ccid_code>Dim doubleDown = Function(n AsString) If n.StartsWith("s") Then Return "extra " & n Else Return n End If End Function</ccid_code></pre></td></tr></table></ccid_nobr></LEFT><p >在Visual Basic 10.0中,和Python及Ruby语言等动态语言的互通操作也变得更加简单。比如,下面的代码片断调用了一个Python库“math.ph”中的方法:<p ><LEFT><ccid_nobr><table width="400" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code" ><pre><ccid_code>Dim mathLib As Object = python.UseFile("math.py") Dim firstNumber = 44.2 Dim secondNumber = 9.5 mathLib.PowerOf(firstNumber, secondNumber)</ccid_code></pre></td></tr></table></ccid_nobr></LEFT><p ><b>C#</b><p >C# 4.0主要增强了与动态编程语言的互通性并改进了Office编程性。动态查找是C# 4.0的一个新功能,能让你用同样的方法使用和操作IronPython、IronRuby、JScript、HTML DOM以及标准.NET库中的对象,不管该对象从哪里获得。命名参数和可选参数,以及对COM客户端支持的改进等语言方面的增强让那些和Office API打交道的C#开发人员与Visual Basic开发人员有同样的美妙体验。<p >在你的代码中加入新的dynamic关键词能让它的类型在运行时被动态解析而非编译时的静态解析。这让动态语言用一种C#编程员觉得自然的方式在C#语言中暴露他们的对象:<p ><LEFT><ccid_nobr><table width="400" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code" ><pre><ccid_code>dynamic dynamicObject = GetDynamicObjectFromRuby(); dynamicObject.Foo(7); dynamicObject.Property = "roperty value"; dynamicObject[0] = "Indexed value";</ccid_code></pre></td></tr></table></ccid_nobr></LEFT><p >可选方法参数对Visual Basic和C++的编程员来说再熟悉不过。现在C#编程员同样可以使用这种参数。可选参数在方法签名中与一个默认值一同声明,如下所示:<p ><LEFT><ccid_nobr><table width="400" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code" ><pre><ccid_code>private void CreateNewStudent(string name, int currentCredits = 0, int year = 1)</ccid_code></pre></td></tr></table></ccid_nobr></LEFT><p >上面这个方法可以用下面任意一种方法调用:<p ><LEFT><ccid_nobr><table width="400" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code" ><pre><ccid_code>CreateNewStudent("Chloe"); CreateNewStudent("Zoe", 16); CreateNewStudent("Joey", 40, 2);</ccid_code></pre></td></tr></table></ccid_nobr></LEFT><p >如果要省略currentCredit参数但指明year参数,可以使用新加入的命名参数功能特性(如高亮的代码所示)。下面所有的调用都是合法的:<p ><LEFT><ccid_nobr><table width="400" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code" ><pre><ccid_code>CreateNewStudent("Jill", year: 2); CreateNewStudent(name:"Bill", currentCredits: 30, year: 2); CreateNewStudent("Will", currentCredits: 4);</ccid_code></pre></td></tr></table></ccid_nobr></LEFT><p >即使不用可选参数,命名参数同时也是一种用来对你现有方法编写自定义调用的好方法。<p ><p align="right"></P><p align="center"></p></p> |
|