动态接口 在纯粹的静态类型语言如C#或者Java或者打开了选项Strict的Visual Basic中,我们只能在一个存在于编译时的目标表达式上调用成员。举例来说,下面的第二个赋值将会导致一个编译时错误,因为类Country没有一个Inflation成员:
Dim Palau As Country = Countries(0) Dim Inflation = Country.Inflation |
然而,在很多情况下,我们需要在并不知道目标类型是静态的情况访问一个成员。如果把选项Strict关闭,Visual Basic将会允许后期绑定成员访问Object类型的目标。尽管功能强大并且也非常灵活,后期绑定还是会带来一些消耗。特别的,我们失去了智能感知和类型推断,只能通过cast或者显式类型回到前期绑定的世界。
经常在进行后期绑定调用的时候,我们假设值是和某个"接口"相依附的。只要对象满足这个接口,我们就高兴了。动态语言社区称此为"Duck Typing"。如果像鸭子一样走路并且像鸭子一样讲话,那么它就是鸭子了。为了解释这一点,下面的例子将会随机的返回Country或者一个新的代表人的匿名类型,它们都具有一个Name属性是String类型的:
Function NamedThing() As Object Dim Static RandomNumbers = New Random() Dim I = RandomNumbers.Next(9) If I < 5 NamedThing = Countries(I) Else NamedThing = New{ .Name = "John Doe", .Age = 42-I } End If End Function Dim Name = CStr(NamedThing().Name) |
当我们调用CStr(NamedThing())进行后期绑定的时候,我们假设NamedThing()的返回值有一个Name成员类型是String。使用新的动态接口的特性,我们可以很明晰的做到这一点。访问其静态类型是一个动态接口的目标的最经常的方式就是使用后期绑定,但是成员访问是静态类型的。这意味着我们得到了全部的智能感知和类型推断,不需要做任何的cast操作或者显式类型:
<Dynamic> _ Interface IHasName Property Name As String End Interface Dim Thing As IHasName = NamedThing() Dim Name = Thing.Name REM Inferred As String. |
动态标识符 动态接口揭示了一个事实,程序员假设他们知道将要在后期绑定中调用的成员的名称和标记。然而在一些完全动态的场景下,我们可能不知道我们将要静态调用的成员的名称。当一个调用表达式的标识符是动态计算出时,动态标识符允许后期绑定调用。
下面的例子使用了三种不同的语言--英语,荷兰语,法语的三个类,每个类都有一个"名称"域:
Class English Name As String End Class Class Nederlands Naam As String End Class Class Francais Nom As String End Class |
为了访问一个人的这个"Name"域,我们将获取这个类型的名字值,并且在一个表里查询这个成员的名字。我们可以使用动态标识符访问来调用正确的Person的成员:
Dim Dictionary = New Dictionary(Of String, String) { _ .Add("English", "Name"), _ .Add("Nederlands", "Naam"), _ .Add("Francais", "Nom") } Dim Person As Object = New Francais { .Nom = "Eiffel" } Dim Name As String = Person.(Dictionary(Person.GetType().Name)) |
结束语 Visual Basic9.0引进了很多新的特性。在这个文档里,我们列出了一些相关的例子来解释这些特性,不过下面的主题也值得一提:
·关系,对象和XML数据:Visual Basic 9.0统一的访问数据,无论数据源是在关系数据库里,XML文档里,还是任意的对象图里,是持续保存的还是只是在内存中暂存。这个统一包括样式,技术,工具和编程方式。这个Visual Basic的动态语法使得在语言里加入一些诸如XML literals和与SQL类似的查询综合变得很容易。这也减少了新的.NET语言里集成的查询API的"表面区域",增加了诸如智能感知和聪明标记的一些数据访问特性的发现能力,通过提升字符串数据中的外国语法进入本地语言极大的提高了调试嗯农国里。在这个特性里,我们希望通过进一步提升XSD方案来增加XML数据的一致性。
·静态类型及其增加的动态特性:静态类型的好处是人所共知的:在编译时而非运行时标出bug,通过前期绑定访问达到高性能,程序代码清晰等等。然而,有些时候,动态类型使得代码更加短小,清楚和灵活。如果语言并不直接支持动态类型,当程序员需要的时候,他们就会通过反射,字典,分派表等等技术来一点点实现动态结构。这就会造成bug的出现和维护费用的增加。Visual Basic对动态和静态类型的支持,将这两个美好的世界传送给了程序员。
·减少程序员负担:一些诸如类型推断,对象初始化和非严格委托的特性在不影响性能的同时,极大的减少少了代码冗余和其他一些程序员需要学习,查找和记忆的规则。一些诸如甚至在后期绑定的情况下支持智能感知的动态接口的特性,增加了高级特性的发现能力。
尽管看起来Visual Basic9.0列出了一堆新特性,我们希望以上的主题将会使你更加方便的,舒服的使用它,并且使得VB成为世界上最好的编程系统。我们希望你的灵感也被激发,并且和我们一样认识到着确实是一个更加伟大的事情的开始。
热卖推荐:
手机 诺基亚 MP5 电脑包 双卡双待 手机链 U盘 笔记本电脑