HOW TO:定義型別安全集合
更新:2007 年 11 月
您可以使用 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 例外狀況。
防止發生型別安全問題
建議透過定義「泛型類別」,將型別安全最大化。這會強制使用強型別,也會提供它所使用之特定資料型別中的彈性。如需詳細資訊,請參閱 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:定義型別安全集合。
如果 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 利用「晚期繫結」(Late Binding),而降低效能。
請注意,Visual BasicCollection 類別接受並傳回 Object 項目,因此它也具有弱型別和晚期繫結的缺點。