Visual Basic 集合類別

「集合」(Collection) 是將一組相關項目群組起來的方式。 集合有許多種。 Visual Basic 應用程式中所使用預先定義的集合有許多用途,例如 FormControl.ControlCollection,是由表單的 Controls 屬性所傳回。 您也可以建立自己的集合,以便組織及管理物件。

集合適合記錄您的應用程式可能需要動態建立和終結的物件。 以下程式碼片段會顯示如何使用 Visual Basic Collection 物件的 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 命名空間的「泛型」(Generic) 集合。 如需詳細資訊,請參閱 HOW TO:建立物件集合 (Visual Basic)

建立和終結集合物件

當控制項傳遞至宣告陳述式 (Declaration Statement) 時,宣告變數 widgetColl 的 New 運算子 (Visual Basic) 關鍵字將會建立 Collection 物件。 由於 Collection 是類別而不是實值型別 (Value Type),因此您必須建立它的執行個體,並在變數中存放這個執行個體的參考。 這個執行個體是 Visual Basic Collection 物件。

和其他物件一樣,當含有變數參考的最後一個變數設定為 Nothing (Visual Basic) 或超出範圍時,Collection 物件將標記為記憶體回收 (GC)。 執行記憶體回收時,將釋放其包含的所有物件參考。 因此,前述範例中的變數 widgetColl 會在父代 (Parent) 類別中宣告,如此才能存在於整個程式過程中。

集合會保留其控制物件的參考,但不包含物件本身。 因此,終結 Collection 物件不會終結其控制的物件。 每個曾是集合項目的個別物件都會存在值到分別標記為記憶體回收。

使用項目

加入、刪除和擷取集合項目的基本服務會視索引鍵和索引而定。 「索引鍵」(Key) 是 String 值。 它可以是名稱、駕照號碼、電話號碼或只是轉換為字串的整數。 Add 方法可以使索引鍵和項目產生關聯,請參閱 HOW TO:加入、刪除和擷取集合項目 (Visual Basic) 的說明。

Collection 類別中的「索引」(Index) 是介於 1 和集合項目數目之間的整數。 Count 屬性會傳回目前的項目數目。 呼叫 Add 時,您可以使用 Before 或 After 參數來控制項目索引的初始值,但這個索引值會隨著其他項目的加入和刪除而變更。 如需詳細資訊,請參閱 Add

透過將項目的索引鍵或索引傳遞至 Remove 方法,可以自集合中移除單一項目。 還可以使用 Clear 方法清空集合並移除所有項目。

存取元素

您可以傳遞索引鍵值至 Contains 方法,以測試集合是否包含具有該索引鍵的項目。 也可以傳遞其索引鍵或索引至 Item 屬性,以擷取項目。

還可以使用索引值和 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 迴圈 (Loop) 會在執行階段擲回 ArgumentException 例外狀況。

項目的資料型別

Visual Basic Collection 物件會將每個項目儲存為資料型別 Object。 因此,加入的資料型別範圍 Collection 的物件與可以儲存在 Object 變數中的資料型別範圍相同。 這包含標準資料型別、物件和陣列,另外還包括使用者定義結構和類別執行個體。

由於 Collection 物件將每個項目儲存為 Object,Item 屬性會傳回 Object 值。 若要使用程式碼中的項目,通常必須自 Object 轉換至該項目的執行階段資料型別。 執行轉換的方法,則視 Option Strict 陳述式中型別檢查 (Type Checking) 參數的設定而定。

自物件隱含轉換

如果 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

自物件明確轉換

如果 Option Strict 為 On,您必須將 Object 明確轉換為項目的執行階段資料型別。 若要使用此方法自 Item 取得項目,可以使用 CType 函式 (Visual Basic)執行轉換,如下列範例所示。

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 方法中確保此情況,便擁有「強型別」(Strongly Typed) 集合,而且不需要將傳回的 Item 屬性轉換為其執行階段的資料型別。 這會增加效能。

透過建立自己的集合類別,您可以提供更穩固的功能,以及其他屬性、方法與事件,請參閱 HOW TO:在類別中定義集合 (Visual Basic)的說明。

請參閱

參考

Collection

概念

Visual Basic 中的陣列

Visual Basic 中的集合