如何:定义类型安全集合 (Visual Basic)
可以使用由 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 中的泛型类型 (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)。 有关更多信息,请参见如何:定义类型安全集合 (Visual Basic)。
如果 Item 返回了 Object 类型的元素,您将只能显式访问在 Object 类上定义的属性和方法。 要访问 widget 成员,必须设置 Option Strict Off,或使用 CType 函数 (Visual Basic) 显式地将返回的元素转换为 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 Basic Collection 类接受并返回 Object 元素,因此,它也具有弱类型和后期绑定的缺点。
请参见
参考
System.Collections.Specialized