当前位置:K88软件开发文章中心编程语言.NET.NET02 → 文章内容

Visual Basic 2010 新增功能

减小字体 增大字体 作者:佚名  来源:翔宇亭IT乐园  发布时间:2019-1-3 0:13:15

作):

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 array 
Dim matrix = {{1, 0}, {0, 1}} 
 
'jagged array - the parentheses force evaluation of the inner array 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# 编译器将可识别具有特殊动态语义的对象。请不要手动实现该接口,更简单的方法是:从 System.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 System.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 20

上一页  [1] [2] [3] [4] [5]  下一页


Visual Basic 2010 新增功能