visualbasic2010:Visual Basic 2010 新增功能

  自 1991 年 Visual Basic 语言诞生的日起它就直是生成应用高效率工具将近 20 年的后它继续提供和 Microsoft .NET Framework 轻松对接使开发人员能够编写可跨越桌面、电话、浏览器甚至云应用

  Microsoft 将在本月发布 Visual Studio 2010其中包含 Visual Basic 版本 10(有时称为 VB 2010 或 VB10)此版本是迄今为止最强大版本包含许多省时省力功能可以帮助开发人员通过更少代码行完成更多操作在这里将会为您提供所有必要内容让您充分了解并利用 Visual Studio 2010 中 Visual Basic

  共同演变

  在过去Visual Basic 和 C# 是由独立团队(Team)分别开发这通常会导致些功能先出现在种语言中继而又出现在另种语言中例如C# 有 Visual Basic 中所没有自动实现属性和集合值设定项而 Visual Basic 则有 C# 中所没有晚期绑定和可选参数等功能但每当种语言具有新功能时许多客户都会要求将该功能也添加到另种语言中

  为了解决这需求Microsoft 合并了 Visual Basic 和 C# 团队(Team)实行共同演变策略是为推动这些语言共同发展种语言中引入重大功能时它也会出现在另种语言中这并不是说每种功能都将出现在两种语言中并按完全相同方式工作;实际上每种语言都有自己历史、灵魂和感觉 – 保留这些特性非常重要共同演变意味着您在种语言中可以执行任何任务都可以通过另种语言轻松实现

  在 .NET Framework 4 中Visual Basic 和 C# 朝这目标迈进了大步分别吸收了对方既有许多功能然而共同演变不仅影响到以前功能;它同样是这些语言未来发展策略本着这种精神.NET Framework 4 在两种语言中同时引入了强大新功能例如动态语言运行时、嵌入式互操作类型和泛型方差从而使 Visual Basic 和 C# 开发人员能够充分利用 .NET Framework

  Visual Basic 2010 新增功能

  Visual Basic 2010 中新功能旨在帮助您通过更少代码行实现更多操作我们 Visual Basic 设计团队(Team)仔细研究了开发人员通常不得不编写大量繁琐样板代码地方并找到相应解决办法让编译器代替执行此类工作当然这是从整体上来看现在就让我们深入了解各项功能

  隐式行继续符

  Visual Basic 是种面向行语言它使用类似于英语清晰语法来增强可读性但这通常会导致代码遇到每行 80 个限制从而迫使开发人员要进行大量滚动您可以使用下划线来告知编译器应将下行作为当前行继续处理(也就是说将多个物理行视为单个逻辑行)但不得不重复地键入下划线直很令人烦恼而事实上多年以来排在首位功能请求就是让编译器“解决这个问题”

  而在 Visual Basic 2010 中编译器能够解决这个问题编译器现在知道哪些标记(例如逗号、圆括号和运算符)往往出现在行继续符前面并且它会插入因此开发人员不再需要插入例如用逗号作为 Visual Basic 语句结尾肯定不合逻辑;编译器知道这因此当编译器看到诸如 {comma, enter} 这样标记流时它会推断出存在行继续符如图 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、&、、-=、*=、/=、\=、^=、>>=、<& lt;=、&=、<、<=、>、>=、<>、Is、IsNot、Like、And、Or、Xor、 AndAlso、OrElse   X
With(在对象值设定项中)   X



  如您所见有 60 多处该语言不需要下划线地方(事实上本文中任何个代码举例都不需要行继续符)当然您仍然可以使用下划线因此 Visual Basic 以前版本中代码将仍然按预期方式编译

  语句 Lambda

  术语 lambda 乍听上去可能很吓人但 lambda 只是在另内定义Visual Basic 2008 引入了带 Function 关键字 lambda 表达式:

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


  Lambda 表达式使您能够在本地以细致紧凑方式表达逻辑而不必跨多个思路方法拆分逻辑例如下面是 Visual Basic 2005(不支持 lambda 表达式)中以前代码表示形式:

Dim query = Array.FindAll(customers, AddressOf Filter) 
 
  ... 
 
Function Filter(ByVal c As customer) As Boolean 
 Return c.Country = "Canada" 
End Function


  不幸Visual Basic 2008 lambda 表达式要求表达式返回值因此以下代码:

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

  将会导致以下情况:

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

  Console.WriteLine 是个 Sub 过程(C# 中为 void)因此它不会返回值而这就是编译器产生原因所在为了处理此情况Visual Basic 2010 引入了对语句 lambda 支持后者是包含个或多个语句 lambda:

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

  由于 Console.WriteLine 不返回值因此我们可以只创建 Sub lambda而不是 Function lambda下面是使用多个语句个举例:

Array.ForEach(customers, Sub(c) 
              Console.WriteLine("Country Name:") 
              Console.WriteLine(c.Country) 
             End Sub)


  当此代码运行时它将为每个客户打印两行另外请注意如果在编码时悬停在 c 上您将看到编译器会将类型推断为 Customer(键入 c As Customer 来显式声明类型也是合法)动态编写事件处理是语句 lambda 个出色用途:

AddHandler b.Click, Sub(sender As Object, e As EventArgs) 
           MsgBox("Button Clicked") 
           'insert more complex logic here 
          End Sub


  并且事实上您可以将语句 lambda 和 Visual Basic 2008 中引入项功能(松散委托)结合使用(可以使用委托 – 类型安全指针 – 次性执行多个)这种组合将生成更为简单签名:

AddHandler b.Click, Sub 
           MsgBox("Button Clicked") 
           'insert more complex logic here 
          End Sub


  委托松散使您可以完全忽略事件处理参数 – 这是个很好优点只要它们根本未使用过因此它们只会在视觉上带来干扰

  除了到目前为止我们已看到单行 Sub lambda 和多行 Sub lambda 外Visual Basic 2010 还支持多行 Function lambda:

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)


  语句 lambda 个引人关注方面是它们和 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  
        End If 
       End Function 
 
MsgBox(method("Paper"))


  如果运行此代码您将看到消息框中显示值 4.5此外如果悬停在 method 上您将看到文本 Dim method As <Function(String) As Double>由于我们未提供实际委托类型因此编译器将自动生成个委托类型如下所示:

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

  这称为匿名委托它只会出现在编译器生成代码中而不会出现在编写代码中请注意当事实上没有提供 As 子句来指定 lambda 返回类型时编译器将返回类型推断为 Double编译器将查看 lambda 内所有返回语句并将确定类型 Double (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  
        End If 
       End Function


  然后它将运行其基准类型算法并确定它能够安全地将 10 转换为 Double但无法安全地将 4.5 转换为 Integer;因此 Double 是更好选择

  您也可以显式控制返回类型在这种情况下编译器将不会尝试推断类型非常常见做法是将 lambda 赋给具有显式委托类型变量而不是依赖于编译器来推断委托类型:

Dim method As Func(Of String, Single) = 
 Function(product) 
  If product = "Paper" Then 
   Return 4.5 'units in stock 
  Else 
   Return 10 '10 of everything  
  End If 
 End Function


  由于提供了显式目标类型因此无需声明 As String 或 As Single;编译器可基于语句左边委托类型来推断出其存在因此如果您悬停在 product 上将会发现推断出类型为 String不再必须指定 As Single委托类型已提供该信息在前面举例中Func 委托(.NET Framework 包括该委托)签名如下所示:

Delegate Function Func(Of T, R)(ByVal param As T) As R

  但有个很小例外的处稍后我们将在“泛型方差”节中看到

  自动实现属性

  在 Visual Basic 中属性是用于向外部公开对象状态类成员典型属性声明和如下声明类似:

Private _Country As String 
 
Property Country As String 
 Get 
  Return _Country 
 End Get 
 Set(ByVal value As String) 
  _Country = value 
 End Set 
End Property


  个实际上非常简单概念就有 10 行代码由于典型对象通常有数十个属性因此您最终会在类定义中包括大量样板代码为了简化此类任务Visual Basic 2010 引入了自动实现属性利用该属性您只需使用行代码即可定义简单属性:

Property Country As String

  在这种情况下编译器将继续运行并自动生成 Getter、Setter 和支持字段支持字段名称是始终为前面带有下划线属性名称:此例中为 _Country这种命名约定在将自动实现属性更改为常规属性情况下确保了 2进制序列化兼容性只要支持字段名称相同 2进制序列化就将继续工作

  您可使用自动实现属性执行其中项出色功能是:指定在构造运行时设置属性默认值值设定项举例来说个带有实体类常见方案将主键设置为类似于 -1 以指示其处于未保存状态代码将如下所示:

Property ID As Integer = -1

  当构造运行时支持字段 (_ID) 将自动设置为值 -1值设定项语法也适用于引用类型:

Property OrderList As List(Of Order) = New List(Of Order)

  由于无需输入两次类型名称因此上行代码可能不会具有非常明显“Visual Basic 特征”好消息是常规变量声明中有个和 Visual Basic 所允许语法更短语法:

Property OrderList As New List(Of Order)

  您甚至能够将此语法和对象值设定项结合使用以允许设置其他属性:

Property OrderList As New List(Of Order) With {.Capacity = 100}

  很显然对于更复杂属性扩展语法仍然是必要您仍然可以键入 Property{Tab} 来激活旧属性片段或者在键入属性行后您可以只输入 Get{Enter}IDE 将生成旧样式属性:

Property Name As String 
 Get 
 
 End Get 
 Set(ByVal value As String) 
 
 End Set 
End Property


  人们通常会发现:新属性语法和公共字段语法几乎相同那么为什么不改为使用公共字段?有几个原因:

  大多数 .NET 数据绑定基础结构都依据属性(而不是字段)工作

  接口无法强制要求存在字段;但可以强制要求存在属性

  属性为更改业务规则提供了更长期灵活性例如假定某人引入了电话号码必须为 10 位数规则如果分配给公共字段将无法执行此验证对于诸如 2进制序列化和反射等方案而言将公共字段更改为属性是项重大更改

  集合值设定项

  种常见 .NET 做法是例子化集合然后通过为每个元素次 Add 思路方法来填充该集合:

Dim digits As New List(Of Integer) 
digits.Add(0) 
digits.Add(1) 
digits.Add(2) 
digits.Add(3) 
digits.Add(4) 
digits.Add(5) 
digits.Add(6) 
digits.Add(7) 
digits.Add(8) 
digits.Add(9)


  但对于从根本上而言非常简单概念来说将会产生大量语法开销Visual Basic 2010 引入了集合值设定项使您能够更轻松地例子化集合对于此代码:

Dim digits = New List(Of Integer) From {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}

  编译器将自动生成对 Add 思路方法所有您也可以使用 Visual Basic As New 语法功能:

Dim digits As New List(Of Integer) From {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}

  请注意在 Visual Basic Team 上我们直建议使用第 2种语法 (As New)而不是前者它使代码更能适应 Option Infer 设置更改

  您可以依据满足以下要求任何类型使用集合值设定项:

  您可以使用 For Each 语句循环访问该类型 – 也就是说该类型实现 IEnumerable(有关集合类型更精确/详细定义请参见 msdn.microsoft.com/library/aa711986(VS.71).aspx 上 Visual Basic 语言规范标准第 10.9.3 节)

  该类型具有可访问(但不定是公共)无参数构造

  该类型具有可访问(但不定是公共)例子或名为 Add 扩展思路方法

  这意味着您也可以将集合值设定项用于更复杂类型例如字典:

Dim lookupTable As New Dictionary(Of Integer, String) From 
 {{1, "One"}, 
  {2, "Two"}, 
  {3, "Three"}, 
  {4, "Four"}}


  (请注意即使此语句跨了 5行也没有下划线)在这种情况下编译器将生成和化字典旧思路方法等效代码:

Dim lookupTable As New Dictionary(Of Integer, String) 
lookupTable.Add(1, "One") 
lookupTable.Add(2, "Two") 
lookupTable.Add(3, "Three") 
lookupTable.Add(4, "Four")


  编译器在具有两个 参数(而不是个参数) Add 思路方法它的所以知道这样做原因是传入集合值设定项值位于嵌套大括号中如下所示:{{1, “One”}, {2, “Two”}, …}对于每组嵌套大括号编译器会尝试将这些参数传递到兼容 Add 思路方法

  也可以通过使用扩展思路方法来提供您自己自定义 Add 实现:

<Extension> 
 Sub Add(ByVal source As IList(Of Customer), 
     ByVal id As Integer, 
     ByVal name As String, 
     ByVal city As String) 
 
   source.Add(New Customer With 
         { 
          .ID = id, 
          .Name = name, 
          .City = city 
         }) 
 End Sub


  (看看所有这些缺失下划线!)此思路方法扩展任何实现 IList(Of Customer) 类型然后允许您使用新集合值设定项语法如下所示:

Dim list = New List(Of Customer) From 
      { 
       {1, "Jon", "Redmond"}, 
       {2, "Bob", "Seattle"}, 
       {3, "Sally", "Toronto"} 
      }


  (向列表 中添加 3个客户)您也可以将集合值设定项和自动实现属性结合使用:

Property States As New List(Of String) From {"AL", "AK", "AR", "AZ", ...}

  文本

  除了更强大集合类型处理方式外Visual Basic 2010 还提供了些用于处理强大增强功能假设有以下代码(在较旧版本中可正常工作):

Dim numbers As Integer = New Integer {1, 2, 3, 4, 5}

  通过查看该元素很明显每个元素都是整数因此必须实际上在此行中打印输出两次 Integer 操作不会真正添加任何值文本 允许将某个所有元素放在大括号内然后让编译器自动推断类型从而创建该:

Dim numbers = {1, 2, 3, 4, 5}

  numbers 类型不是 Object而是 Integer(只要启用了“Option Infer”)原因是文本现在可代表本身并且有其自己类型假设有个更复杂举例:

Dim numbers = {1, 2, 3, 4, 5.555}

  在这种情况下numbers 类型将被推断为 Double编译器通过检查每个元素并计算基准类型(所使用算法和前面讨论用于推断语句 lambda 返回类型算法相同)从而确定类型如果没有基准类型将会发生什么情况?例如以下代码中所示:

Dim numbers = {1, 2, 3, 4, "5"}

  在这种情况下将 Integer 转换为 String 将会缩小转换范围(也就是说在运行时可能会出现数据丢失情况)同样将 String 转换为 Integer 也会缩小转换范围可选择安全类型为 Object(如果启用了“Option Strict”编译器将产生)

  可以嵌套文本以形成多维或交错:

'2-dimensional .gif' /> 
Dim matrix = {{1, 0}, {0, 1}} 
 
'jagged .gif' /> - the parentheses force evaluation of the inner .gif' /> first 
Dim jagged = { ({1, 0}), ({0, 1}) }


  动态语言运行时

  尽管 Visual Basic 从技术上而言实质上是静态语言但它直有非常强大动态功能例如晚期绑定Visual Studio 2010 附带了个名为动态语言运行时 (DLR) 新平台利用该平台可更为轻松地生成动态语言 – 并在这些语言的间通信Visual Basic 2010 已更新为在其晚期绑定中完全支持 DLR从而使开发人员能够使用采用其他语言(例如 IronPython/IronRuby)开发库和框架

  此功能项突出优点是从语法上而言没有任何内容发生更改(事实上在编译器中没有修改任何行代码来支持此功能)开发人员仍然能够像在 Visual Basic 以前版本中样进行晚期绑定操作发生变化是 Visual Basic 运行库 (Microsoft.VisualBasic.dll) 中代码该运行库现在可识别 DLR 提供 IDynamicMetaObjectProvider 接口如果某个对象实现此接口则 Visual Basic 运行库将构建 DLR CallSite并允许该对象及提供该对象语言将它们自己语义注入操作

  例如Python 标准库包含个名为 random.py 文件其中有个名为 shuffle 思路方法该思路方法可用于随机重新排列元素该思路方法很简单:

Dim python As ScriptRuntime = Python.CreateRuntime 
Dim random As Object = python.UseFile("random.py") 
 
Dim items = {1, 2, 3, 4, 5, 6, 7} 
random.shuffle(items)


  在运行时Visual Basic 会看到对象实现 IDynamicMetaObjectProvider并因此将控制权交给 DLR后者随后将和 Python 通信并执行该思路方法(将 Visual Basic 中定义作为参数传递给该思路方法)

  这是启用了 DLR API 个举例但开发人员也可以创建他们自己使用此功能 API关键是实现 IDynamicMetaObjectProvider 接口在这种情况下Visual Basic 和 C# 编译器将可识别具有特殊动态语义对象请不要手动实现该接口更简单思路方法是:从 .Dynamic.DynamicObject 类(该类已实现此接口)继承并仅仅重写少数几个思路方法图 3 显示了创建自定义动态对象(种似乎可实时创建属性“属性包”)并使用正常 Visual Basic 晚期绑定来该对象完整举例(有关使用 DynamicObject 详细信息请阅读 Doug Rothaus 撰写非常不错文章网址为 blogs.msdn.com/vbteam/archive/2010/01/20/fun-with-dynamic-objects-doug-rothaus.aspx)

  图 3 创建自定义动态对象并使用 Visual Basic 晚期绑定该对象

Imports .Dynamic 
 Module Module1 
  Sub Main 
   Dim p As Object = New PropertyBag 
    p.One = 1 
    p.Two = 2 
    p.Three = 3 
   Console.WriteLine(p.One) 
   Console.WriteLine(p.Two) 
   Console.WriteLine(p.Three) 
  End Sub 
   Class PropertyBag : Inherits DynamicObject 
    Private values As New Dictionary(Of String, Integer) 
    Public Overrides Function TrySetMember( 
     ByVal binder As SetMemberBinder, 
     ByVal value As Object) As Boolean 
      values(binder.Name) = value 
     Return True 
    End Function 
    Public Overrides Function TryGetMember( 
     ByVal binder As GetMemberBinder, 
     ByRef result As Object) As Boolean 
     Return values.TryGetValue(binder.Name, result) 
    End Function 
   End Class 
 End Module


  泛型方差

  这是项乍听起来确可能很复杂功能(带有像协方差和逆变这样术语)但实际上它很简单如果您有类型为 IEnumerable(Of Apple) 对象并且希望将其分配给 IEnumerable(Of Fruit)这应是合法每个 Apple 都是 Fruit(由继承关系强制要求)遗憾在 Visual Basic 2010 的前编译器中不支持泛型方差即使公共语言运行时 (CLR) 中实际上支持泛型方差也是如此

  让我们看下图 4 中举例在 Visual Basic 2008 中图 4 中代码将在 Dim enabledOnly 行上产生编译(或者如果禁用了“Option Strict”则产生运行时异常)解决思路方法是 .Cast 扩展思路方法如下所示:

'Old way, the call to Cast(Of Control) is no longer necessary in VB 2010 
  Dim enabledOnly = FilterEnabledOnly(buttons.Cast(Of Control))


  这点不再必要在 Visual Basic 2010 中已通过使用 Out 修饰符将 IEnumerable 接口标记为协变:

Interface IEnumerable(Of Out T) 
 ... 
End Interface


  图 4 泛型方差举例

Option Strict On 
Public Class Form1 
 Sub Form1_Load Handles MyBase.Load 
  Dim buttons As New List(Of Button) From 
   { 
    New Button With 
    { 
     .Name = "btnOk", 
     .Enabled = True 
    }, 
    New Button With 
    { 
     .Name = "btnCancel", 
     .Enabled = False 
    } 
   } 
 
  Dim enabledOnly = FilterEnabledOnly(buttons) 
 End Sub 
 Function FilterEnabledOnly( 
  ByVal controls As IEnumerable(Of Control) 
  ) As IEnumerable(Of Control) 
  Return From c In controls 
  Where c.Enabled = True 
 End Function 
End Class


  这意味着泛型参数 T 现在为变量(也就是说它适用于继承关系)并且编译器将确保仅在类型来自于接口位置使用该参数泛型参数也可以是逆变量这意味着它们仅在输入 位置使用类型可实际上具有这两者例如前面讨论 Func 委托既具有逆变参数(传入内容)也具有协变参数(用于返回类型):

Delegate Function Func(Of In T, Out R)(ByVal param As T) As R

  可以在自定义接口和委托上使用 In 和 Out 修饰符.NET Framework 4 中许多常用接口和委托已标记为变量;常见举例包括所有 Action/Func 委托、IEnumerable(Of T)、IComparer(Of T) 和 IQueryable(Of T) 等

  泛型方差突出优点是:它是项您完全无需担心功能 – 如果它在执行工作您将绝不会注意到它曾经会导致编译器或要求 .Cast(Of T) 情形在 Visual Basic 2010 中工作正常

  改进可选参数

  可选参数提供了种有用高效功能它使开发人员能够建立更灵活思路方法并避免使用许多思路方法重载使类混乱不堪在过去有点限制即可选参数不能为 null(或者甚至不能为任何非内部结构类型)Visual Basic 2010 现在允许您定义任意 值类型可选参数:

Sub DisplayOrder(ByVal customer As Customer, 
         ByVal orderID As Integer, 
         Optional ByVal units As Integer? = 0, 
         Optional ByVal backgroundColor As Color = Nothing) 
End Sub


  在此例中units 类型为 Nullable(Of Integer)backgroundColor 为非内容结构类型但仍然将它们用作可选参数Visual Basic 2010 还对泛型可选参数提供了更好支持

  嵌入式互操作类型

  对于执行 COM 互操作应用个常见弱点是必须要使用主互操作集 (PIA)PIA 是种 .NET 它充当 COM 组件上运行时可包装 (RCW)并具有用来标识它 GUID .NET 集和 PIA 通信后者随后执行任何必要封送以在 COM 和 .NET 的间移动数据

  遗憾PIA 可能会使部署变得很复杂它们是需要部署到最终用户计算机附加 DLL它们还可能会导致版本控制问题 – 例如如果您希望应用能够同时依据 Excel 2003 和 Excel 2007 工作则将需要随应用起同时部署两个 PIA

  嵌入式互操作类型功能直接嵌入应用但只会嵌入绝对必要 PIA 中类型和成员因此无需将 PIA 部署到最终用户计算机

  若要为现有对象启用此功能(对于新引用默认情况已启用此功能)请在解决方案资源管理器中选择引用并在属性窗口中更改“Embed Interop Types”选项(请参见图 5)或者如果使用命令行编译器进行编译请使用 /l(或 /link)开关而不是 /r 和 /reference



  图 5 在解决方案资源管理器中启用嵌入式互操作类型

  启用此功能的后应用将不再依赖于 PIA事实上如果在 Reflector 或 ildasm 中打开您将注意到实际上根本没有对 PIA 任何引用

  多重目标

  Visual Basic 2010 中所有功能最突出特点是:您甚至可以在目标为 .NET Framework 2.0 至 .NET Framework 3.5 项目中使用这些功能这意味着隐式行继续符、文本、集合值设定项、语句 lambda、自动实现属性等功能将全部都可在现有项目中使用而不必将目标重定为 .NET Framework 4

  例外情况是嵌入式互操作类型它依赖于只有 .NET Framework 4 中才有类型;因此如果将目标定为 .NET Framework 版本 2.0 至 3.5则无法使用该功能此外只会采用 .NET Framework 4 中方式对标记为变量类型进行标记因此在前面举例中如果将目标定为版本 2.0 至 3.5则仍然必须 .Cast(Of T)不过如果将目标定为这些早期版本您可以建立自己变量类型(使用 In/Out 修饰符)

  若要更改应用当前目标框架请双击“我项目”单击“编译”选项卡单击“高级编译选项”然后从底部组合框中进行选择

  在从命令行中进行编译时实际上没有命令行开关可启用此功能实际上编译器将查看哪个集提供了 .Object 定义(通常为 mscorlib)以及目标定为哪个框架然后在输出集中标记该值(编译器在生成 Silverlight 集时也使用这个同样机制)在使用 IDE 时所有这些都是以透明方式进行因此通常您无需担心任何事情

  欢迎试用

  如您所见Visual Basic 2010 具有许多强大功能这些功能使您能够提高工作效率同时减少编写代码行数而将更多工作交给编译器来做在本文中我只探讨了语言功能但 Visual Basic 2010 IDE 还有数不胜数出色增强功能下面列出部分增强功能:

  导航到

  突出显示引用

  从使用中生成

  更好 IntelliSense(子串匹配、驼峰式大小写查找、建议模式 – 对于“首先测试”开发风格非常有用)

  多监视器支持

  缩放

  Visual Basic 团队(Team)渴望听到您对我们改善 Visual Basic 工作方面反馈因此请在 Microsoft Connect 上将您意见和问题发送给我们若要了解有关语言和 IDE 功能详细信息请查看 msdn.com/vbasic 上内容其中包括文章、举例和操作思路方法视频当然最佳学习方式是深入研究和使用产品因此是安装和试用产品时候了

Tags:  visualbasic教程 visualbasic6.0 visualbasic visualbasic2010

延伸阅读

最新评论

发表评论