集合初始化器概览(Visual Basic)

集合初始化器概览 Collection Initializers Overview (Visual Basic)

集合初始化器提供简化的语法,使得创建集合的同时,可以用初始的集合值来填充它。当从既有的集合值创建新集合时,集合初始化器显得特别有用,例如,菜单列表或者编目(categories)、初始的数值集合、静态字符串列表如月份名称,或者地理位置如验证所用的州郡列表。

标识集合初始化器的方式是,用 From 关键字,后面紧跟着大括号"{}"。这类似于数组文本语法(array literal syntax)。下面代码展示用集合初始化器创建集合的各种方式:

' 创建 String数组
Dim winterMonths = {"December""January""February"}
 
' 创建 Integer 数组
Dim numbers = {12345}
 
' 创建菜单选项列表,需要List(Of MenuOption)的一个扩展方法 Add
Dim menuOptions = New List(Of MenuOption) From {{1"Home"},
{
2"Products"},
{
3"News"},
{
4"Contact Us"}}

 注意:C# 也提供集合初始化器,其功能如 VB 的一样。欲知更多关于 C# 集合初始化器,请看Object and Collection Initializers (C# Programming Guide)。

语法

集合初始化器由紧跟着 From 关键字、包含在大括号中、以逗号分隔的列表组成,如以下代码:

Dim names As New List(Of String) From {"Christa""Brian""Tim"}

 当你创建一个集合,如 List(Of T) 或者Dictionary(Of TKey, TValue),必须在集合初始化器前提供集合类型,如以下代码:

Public Class AppMenu
    
Public Property Items As List(Of String=
        
New List(Of String) From {"Home""About""Contact"}
End Class

 注意:集合初始化器不可跟对象初始化器(object initializer)一起使用。

用集合初始化器创建集合

使用集合初始化器创建集合时,集合初始化器提供的每个值都将传递给适当的 Add 方法。例如,您用集合初始化器创建一个 List(Of T),集合初始化器的每个值都传递给 Add 方法。若您想用集合初始化器创建集合,指定的类型必须是正确的集合类型(valid collection type)。正确集合类型的例子包含,实现了IEnumerable(Of T)接口的的类,或者是继承自 CollectionBase 类。指定的类型必需暴露满足格式的 Add 方法。

Add 方法必须在调用集合初始化器的上下文中可见。如果您在可以访问 非公有方法的地方使用集合初始化器,Add 方法不必须是 Public。

Add 方法必须是实例方法,或者共享方法,又或者扩展方法。

基于重载解决规则(overload resolution rules),对于集合初始化器提供的类型,必须存在可以匹配Add 方法。

例如,下面代码演示如何运用集合初始化器创建一个List(Of Customer) 。当代码运行时,每个 Customer 对象传递给泛型的 Add(Customer)

Dim customers = New List(Of Customer) From
{
    
New Customer("City Power & Light""http://www.cpandl.com/"),
    
New Customer("Wide World Importers""http://www.wideworldimporters.com/"),
    
New Customer("Lucerne Publishing""http://www.lucernepublishing.com/")
}

 如下代码演示不使用集合初始化器的等价物:

Dim customers = New List(Of Customer)
customers.Add(New Customer("City Power & Light""http://www.cpandl.com/"))
customers.Add(New Customer("Wide World Importers""http://www.wideworldimporters.com/"))
customers.Add(New Customer("Lucerne Publishing""http://www.lucernepublishing.com/"))

如果集合有一个 Add 方法的参数 跟 Customer 类的构造函数的参数 一致,您可以将Add 方法的参数值 嵌套到集合初始化器中,这在下一节中讨论。如果集合没有这样一个 Add 方法,您可以创建一个扩展方法。如何给集合添加扩展方法的例子,参见 How to: Create an Add Extension Method Used by a Collection Initializer。如何创建带集合初始化器的自定义集合(custom collection),参见 Create a Collection Used by a Collection Initializer

嵌套的集合初始化器

您可以在集合初始化器中嵌套值,以标识集合中一个特定的 Add 方法的重载版本。传递到 Add 方法的值必须包含在大括号中,并且以逗号分隔,就像在数组文本或集合初始化器中一样。

使用嵌套值创建集合,嵌套值列表的每个元素作为参数传递到匹配该元素类型的 Add 方法。例如,下面代码例子创建一个Dictionary(Of TKey, TValue),key 为 Integer 类型而 value 为 string 类型,嵌套值列表的每个元素匹配 Dictionary 的 Add 方法。

Dim days = New Dictionary(Of IntegerString) From
          {{0"Sunday"}, {1"Monday"}}

上面代码等同于下面的代码:

Dim days = New Dictionary(Of IntegerString)
days.Add(0"Sunday")
days.Add(1"Monday")

只有嵌套值列表的第一级嵌套,才传递到集合的 Add 方法。深层嵌套作为数组文本(array literal),嵌套值列表不会跟集合的任何 Add 方法匹配。

posted @ 2010-05-18 23:50  Felix Liang  阅读(781)  评论(2编辑  收藏  举报