Visual Basic 集合类

更新:2007 年 11 月

“集合”是一种将一组相关项组合在一起的方法。存在许多不同类型的集合。出于多种目的,Visual Basic 应用程序中使用了预定义集合,例如 Form 上的 Control.ControlCollection,它由窗体的 Controls 属性返回。也可以创建自己的集合以组织和操作对象。

对于应用程序可能需要动态创建和销毁的对象,使用集合进行跟踪是一个不错的方法。下面的代码片段演示如何使用 Visual BasicCollection 对象Add 方法保持用户所创建的 widget 对象的列表。

' Declare and create the Collection object.
Public widgetColl As New Microsoft.VisualBasic.Collection() 
' Create a new widget and add it to the widgetColl collection.
Private Sub makeAWidget()
    Dim tempWidget As New widget()
    widgetColl.Add(tempWidget) 
End Sub

在前面的示例中,widgetColl 集合组织并公开通过 makeAWidget 过程创建的所有 widget 对象。可以通过集合的索引检索对每个 widget 的对象引用。当添加每个新 widget 对象时,自动调整集合的大小。可以使用 For Each...Next 语句 (Visual Basic) 语句循环访问集合。如果要为 widget 对象提供一个检索时可以依据的键,则可以将一个文本字符串作为 Add 方法的第二个参数提供。

Visual Basic 的 Collection 对象将其所有元素存储为 Object 类型,以便您可以添加任何数据类型的项。没有保护措施来防止添加不适当的数据类型。若要避免这一缺陷,可以使用 System.Collections.Generic 命名空间的“泛型”集合。有关更多信息,请参见如何:创建对象集合

创建和销毁 Collection 对象

当控件传递到声明语句时,变量 widgetColl 的声明中的 New (Visual Basic) 关键字会导致创建 Collection 对象。因为 Collection 是类而不是值类型,所以必须创建它的一个实例,并在某变量中保存对该实例的引用。此实例是 Visual BasicCollection 对象

和任何其他对象一样,Collection 对象在出现以下情况时被标记为垃圾回收 (GC),即包含对该对象的引用的最后一个变量被设置为 Nothing (Visual Basic) 或超出范围。当垃圾回收对该对象进行回收以后,该对象包含的所有对象引用都将释放。因此,在父类中声明前面示例中的变量 widgetColl,以便它在程序的整个生存期内存在。

集合维护对自己所控制的对象的引用,但不包含这些对象本身。因此,销毁 Collection 对象不会销毁它所控制的对象。曾经作为集合元素的每个对象在各自被标记为垃圾回收之前会继续存在。

使用元素

添加、删除和检索集合元素的基本服务依赖于键和索引。“键”是一个 String 值。它可以是名称、驱动程序的许可证号码、电话号码或者仅仅是转换为字符串的整数。Add 方法允许您将键与元素关联,如如何:添加、删除和检索集合中的项中所述。

Collection 类中的“索引”是介于 1 和集合的项数之间的一个整数。Count 属性(Collection 对象)返回当前项数。调用 Add 时可以使用 Before 或 After 参数控制项索引的初始值,但它的值可能会随着其他项的添加和删除而变化。有关更多信息,请参见 Add 方法(Collection 对象)

将单个元素的键或索引传递到 Remove 方法(Collection 对象),可以从集合中移除该元素。可以使用 Clear 方法(Collection 对象)清空集合并移除所有元素。

访问元素

可以将键值传递到 Contains 方法(Collection 对象),以测试集合是否包含具有该键的元素。将元素的键或索引传递到 Item 属性(Collection 对象)可以对该元素进行检索。

可以使用索引值和 Item 属性来循环访问集合中的项,也可以使用 For Each...Next 语句 (Visual Basic)。下面的示例演示给予 employee 对象集合中所有雇员百分之十加薪的两种方法,前提是假定变量 employeesColl 包含对 Collection 对象的引用。

Option Strict On
' The following alternative uses the Count and Item properties.
Dim emp As employee
For counter As Integer = 1 To employeesColl.Count 
    emp = CType(employeesColl.Item(counter), employee)
    emp.payRate *= 1.1
Next counter
' The following alternative uses the For Each...Next statements.
For Each emp As employee In employeesColl
    emp.payRate *= 1.1
Next emp

但是,如果已经将一个或多个元素添加到类型不是 employee 的 employeesColl,则 For Each 循环将在运行时引发 ArgumentException 异常。

元素的数据类型

Visual Basic 的 Collection 对象使用数据类型 Object 存储每个项。因此,您可以添加到 Collection 对象的数据类型的范围与可以在 Object 变量中存储的数据类型的范围相同。这包括标准数据类型、对象和数组,以及用户定义的结构和类实例。

由于 Collection 对象将每个项存储为 Object,因此 Item 属性返回 Object 值。若要在代码中使用项,通常必须从 Object 转换为该项的运行时数据类型。执行此操作的方法取决于 Option Strict 语句中类型检查开关的设置。

从 Object 隐式转换

如果 Option Strict 为 Off,则可以将 Collection 的元素隐式转换为其相应的数据类型,如下例所示。

Option Strict Off
Dim sampleColl As New Microsoft.VisualBasic.Collection()
Dim sampleString As String = "This is a string"
Dim aString As String
sampleColl.Add(sampleString)
' The following statements convert the collection item to a string.
Try
    aString = sampleColl.Item(1) 
Catch ex As Exception
    ' Insert code to run if the collection item cannot be converted to String.
End Try

从 Object 显式转换

如果 Option Strict 为 On,则必须从 Object 显式转换为元素的运行时数据类型。若要以此方式从 Item 获得元素,则可以使用 CType 函数执行转换,如下例所示。

Option Strict On
Dim sampleColl As New Microsoft.VisualBasic.Collection()
Dim sampleString As String = "This is a string"
Dim aString As String
sampleColl.Add(sampleString)
' The following statements convert the collection item to a string.
Try
    aString = CType(sampleColl.Item(1), String) 
Catch ex As Exception
    ' Insert code to run if the collection item cannot be converted to String.
End Try

其他服务

Collection 对象的属性和方法仅为集合提供最基本的服务。例如,Add 方法无法检查要添加到集合中的元素的类型,而您可能希望执行该检查以确保集合仅包含一种类型的元素。如果可以在 Add 方法中确保这一点,就会得到一个“强类型”集合,这样,您就不一定要将 Item 属性的返回值转换为其运行时数据类型。这将提高性能。

通过创建您自己的集合类,您就可以提供更可靠的功能,还可以提供附加的属性、方法和事件,如如何:在类中定义集合中所述。

请参见

概念

使用集合替代数组

Visual Basic 中的集合

参考

Collection 对象 (Visual Basic)