Share via


HOW TO:定義型別安全集合 (Visual Basic)

您可以使用 Visual Basic 所提供的 Collection 類別 (Class) 定義和建立集合 (如下列範例所示)。

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

然而,這個 widgetColl 集合不是「強型別」(Strongly Typed)。 您可以為它加入任何類型的項目,而不只是 widget 物件。 不過在擷取項目時,可能必須試著將它轉換成 widget。 這可能會造成「型別安全」(Type Safety) 問題。 例如,假設使用下列程式碼將 String 加入至集合。

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

如果這樣做,則因為集合中之項目的型別不是 widget,所以擷取該項目的後續嘗試會在執行階段擲回 ArgumentException 例外狀況。

防止發生型別安全問題

建議透過定義「泛型類別」(Generic Class),將型別安全最大化。 這會強制使用強型別,也會提供它所使用之特定資料型別中的彈性。 如需詳細資訊,請參閱 Visual Basic 中的泛型型別 (Visual Basic)

若要在類別中定義型別安全集合

  • System.Collections.Generic 命名空間 (Namespace) (例如 List<T>) 中的其中一個泛型類別當做集合類別。 然後建立限制只有 widget 成員才能使用的集合。 下列範例會說明如何修改上面範例中的宣告,以建立泛型集合。

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

    這樣做時,強型別只可以讓您將 widget 項目加入至集合中,而透過 Item 屬性擷取的每個項目都是 widget 物件。 也因為這個強型別,所以擷取程式碼可以使用由 widget 公開的所有屬性和方法。

    -或-

  • 建立自己的集合類別,而不使用任何預先定義的類別。 限制 Add 方法只接受 (Accept) widget 物件,而實作傳回型別為 widget 的 Item 屬性。 如需詳細資訊,請參閱 HOW TO:定義型別安全集合 (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 利用「晚期繫結」(Late Binding),而降低效能。

    請注意,Visual Basic Collection 類別接受並傳回 Object 項目,因此它也具有弱型別和晚期繫結的缺點。

請參閱

參考

Collection

System.Collections

System.Collections.Generic

System.Collections.Specialized

Option Strict 陳述式

概念

Visual Basic 中的集合

Visual Basic 中的泛型型別 (Visual Basic)