- ·上一篇文章:在VB2005中使用零长度数组
- ·下一篇文章:VB中实现远程数据库的访问
Visual Basic 2010 新增功能
Property Country As String
在这种情况下,编译器将继续运行并自动生成 Getter、Setter 和支持字段。支持字段的名称是始终为前面带有下划线字符的属性的名称:此例中为 _Country。这种命名约定在将自动实现的属性更改为常规属性的情况下确保了二进制序列化兼容性。只要支持字段的名称相同,二进制序列化就将继续工作。
您可使用自动实现的属性执行的其中一项出色的功能是:指定在构造函数运行时设置属性默认值的初始值设定项。举例来说,一个带有实体类的常见方案将主键设置为类似于 -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 位数的规则。如果分配给公共字段,将无法执行此验证。对于诸如二进制序列化和反射等方案而言,将公共字段更改为属性是一项重大更改。
集合初始值设定项
一种常见 .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 上,我们一直建议使用第二种语法 (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"}}
(请注意,即使此语句跨了五行,也没有下划线字符。)在这种情况下,编译器将生成与初始化字典的旧方法等效的代码:
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"}
}
(向列表 中添加三个客户)。您也可以将集合初始值设定项与自动实现的属性结合使用:
Property States As New List(Of String) From {"AL", "AK", "AR", "AZ", ...}
数组文本
除了更强大的集合类型处理方式外,Visual Basic 2010 还提供了一些用于处理数组的强大增强功能。假设有以下代码(在较旧版本中可正常工
Visual Basic 2010 新增功能