如何:定义类型安全集合

更新:2007 年 11 月

可以使用由 Visual Basic 提供的 Collection 类来定义和创建集合,如以下示例所示。

Public Class widgetRepository
    Public widgetColl As New Microsoft.VisualBasic.Collection()
    ' Insert code to implement additional functionality.
End Class

但是,此 widgetColl 集合并非为强类型。不仅可以向它添加 widget 对象,还可以添加任何类型的元素。在检索元素时,可能要尝试将其转换为 widget。这可能导致类型安全问题。例如,假设使用以下代码向集合添加了一个 String。

Dim notWidget As String = "This is not a widget object!"
widgetColl.Add(notWidget)

如果这样做,则在此后尝试检索该元素时,会在运行时引发 ArgumentException 异常,原因是此集合元素的类型不是 widget。

预防类型安全问题

我们建议您通过定义泛型类最大程度地增强类型的安全性。这会强制实施强类型,同时还提供了它在处理特定的数据类型时的灵活性。有关更多信息,请参见 Visual Basic 中的泛型类型

在类中定义类型安全的集合

  • System.Collections.Generic 命名空间中的一个泛型类(如 List<T>)用于您的集合类。然后,可以创建一个只限制为 widget 成员的集合。下面的示例说明可以如何修改前面示例中的声明,以创建一个泛型集合。

    Public widgetColl As New System.Collections.Generic.List(Of widget)
    

    在这样做时,强类型使您只能向集合中添加 widget 项,您通过 Item 属性检索的每个元素均为 widget 对象。也由于此强类型的缘故,检索代码可以使用 widget 公开的所有属性和方法。

    - 或 -

  • 在不使用任何预定义类的情况下创建您自己的集合类。将 Add 方法限制为只接受 widget 对象,并实现 Item 属性(返回类型为 widget)。有关更多信息,请参见如何:定义类型安全集合

    如果 Item 返回了 Object 类型的元素,您将只能显式访问在 Object 类上定义的属性和方法。要访问 widget 成员,必须设置 Option Strict Off,或使用 CType 函数 显式地将返回的元素转换为 widget,如以下代码所示。

    Dim nextWidget As widget
    Try
        nextWidget = CType(widgetColl.Item(1), widget)
    Catch ex As Exception
        ' Insert code to run if the collection item is not a widget.
    End Try
    

    在以上任一情况中,按此方式使用 Object 元素会导致 Visual Basic 使用后期绑定,这将使性能下降。

    请注意,Visual BasicCollection 类接受并返回 Object 元素,因此,它也具有弱类型和后期绑定的缺点。

请参见

概念

Visual Basic 集合类

Visual Basic 中的集合

Visual Basic 中的泛型类型

参考

System.Collections

System.Collections.Generic

System.Collections.Specialized

Option Strict 语句