- ·上一篇文章:在VB2005中使用零长度数组
- ·下一篇文章:VB中实现远程数据库的访问
Visual Basic 2010 新增功能
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)。或者,如果使用ming令行编译器进行编译,请使用 /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 修饰符)。
若要更改应用程序的当前目标框架,请双击“我的项目”,单击“编译”选项卡,单击“高级编译选项”,然后从底部的组合框中进行选择。
在从ming令行中进行编译时,实际上没有ming令行开关可启用此功能。实际上,编译器将查看哪个程序集提供了 System.Object 的定义(通常为 mscorlib)以及程序集的目标定为哪个框架,然后在输出程序集中标记该值。(编译器在生成 Silverlight 程序集时也使用这个同样的机制。)在使用 IDE 时,所有这些都是以透明方式进行的,因此通常您无需担心任何事情。
欢迎试用
如您所见,Visual Basic 2010 具有许多强大功能,这些功能使您能够提高工作效率,同时减少编写的代码行数,而将更多工作交给编译器来做。在本文中,我只探讨了语言功能,但 Visual Basic 2010 IDE 还有数不胜数的出色增强功能。下面列出部分增强功能:
导航到
突出显示引用
从使用中生成
更好的 IntelliSense(子字符串匹配、驼峰式大小写查找、建议模式 – 对于“首先测试”开发风ge非常有用)
多监视器支持
缩放
Visual Basic 团队渴望听到您对我们改善 Visual Basic 的工作方面的反馈,因此请在 Microsoft Connect 上将您的意见和问题发送给我们。若要了解有关语言和 IDE 功能的详细信息,请查看 msdn.com/vbasic 上的内容,其中包括文章、示例和操作方法视频。当然,最佳学习方式是深入研究和使用产品,因此是安装和试用产品的时候了。
!
Visual Basic 2010 新增功能