Visual Basic のコレクション クラス
更新 : 2007 年 11 月
コレクションは、関連項目の集約をグループ化する方法の 1 つです。コレクションにはさまざまな種類があります。定義済みのコレクションは、Visual Basic アプリケーションでさまざまな目的に使用されます。たとえば、フォームの Controls プロパティによって返される Form の Control.ControlCollection などです。また、独自のコレクションを作成して、オブジェクトを整理したり、操作できます。
たとえば、アプリケーションが動的に作成したり破棄したりするオブジェクトを追跡するにはコレクションが適しています。次のコードは、Visual Basicコレクション オブジェクトの 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 メソッドの 2 番目のパラメータとして文字列を指定します。
Visual BasicCollection オブジェクトは、すべての要素を Object 型として保存するため、任意のデータ型の項目を追加できます。不適切なデータ型が追加されないようにする保護機能はありません。このような制限を回避するには、System.Collections.Generic 名前空間のジェネリック コレクションを使用できます。詳細については、「方法 : オブジェクトのコレクションを作成する」を参照してください。
コレクション オブジェクトの作成と破棄
変数 widgetColl の宣言の New (Visual Basic) キーワードでは、宣言ステートメントに制御が渡されるときに Collection オブジェクトが作成されます。Collection は値型というよりはクラスであるため、インスタンスを作成し、そのインスタンス (オブジェクト) への参照を変数に維持する必要があります。このインスタンスは、Visual Basicコレクション オブジェクトです。
他のオブジェクトと同様に、Collection オブジェクトは、このオブジェクトへの参照を含む最後の変数が Nothing (Visual Basic) に設定されているか、またはオブジェクトに対する参照がスコープ外に出ると、ガベージ コレクション (GC) のマークが付けられます。ガベージ コレクションによって参照が再要求されると、これを含むすべてのオブジェクト参照が解除されます。このような理由から、前の例の変数 widgetColl は、プログラムの実行期間全体を通じて存続するように親クラスで宣言されています。
コレクションは、制御しているオブジェクトへの参照を保持しますが、オブジェクト自身は含みません。したがって、Collection オブジェクトを破棄しても、制御しているオブジェクトを破棄するわけではありません。コレクションの要素であった個々のオブジェクトは、ガベージ コレクションとして個々にマークされるまで存在し続けます。
要素の操作
コレクションの要素の追加、削除、および取得という基本的なサービスは、キーやインデックスに基づいています。キーとは、Stringの値です。キーは、名前、運転免許証番号、電話番号、または単に文字列に変換した整数でもかまいません。Add メソッドでは、「方法 : コレクションの項目を追加、削除、および取得する」に説明されているように、キーを要素に関連付けることができます。
Collection クラスのインデックスは、1 からコレクション内の項目数までの整数です。Count プロパティ (Collection オブジェクト) は、現在の項目数を返します。項目のインデックスの初期値は、Add を呼び出したときの Before または After パラメータを使用して制御できますが、他の項目が追加されたり削除されたりすることによってインデックスの値が変化する可能性があります。詳細については、「Add メソッド (Collection オブジェクト)」を参照してください。
要素のキーまたはインデックスのいずれかを Remove メソッド (Collection オブジェクト) に渡すことで、コレクションから単一の要素を削除できます。Clear メソッド (Collection オブジェクト) を使用して、コレクションを空にしてすべての要素を削除できます。
要素へのアクセス
キーの値を Contains メソッド (Collection オブジェクト) に渡して、コレクションにそのキーを持った要素が含まれているかどうかをテストできます。要素のキーまたはインデックスのいずれかを Item プロパティ (Collection オブジェクト) に渡して、要素を取得できます。
コレクション内の項目を反復処理するには、インデックスの値および Item プロパティを使用するか、または For Each...Next ステートメント (Visual Basic) を使用できます。次の例は、employee オブジェクトのコレクションに含まれるすべての従業員の給料を 10 パーセント上げるための 2 つの方法を示しています。なお、変数 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
ただし、1 つまたは複数の要素を、型が employee ではない employeesColl に追加すると、For Each ループは実行時に ArgumentException 例外をスローします。
要素のデータ型
Visual Basicコレクション オブジェクトでは、各項目のデータ型が Object として保存されます。したがって、Collection オブジェクトに追加できるデータ型の範囲は、Object 変数に保存できるデータ型の範囲と同じになります。これには、基本データ型、オブジェクト、配列、およびユーザー定義の構造体、クラスのインスタンスが含まれます。
Collection オブジェクトは、各要素をObjectとして保存するため、Item プロパティはObjectの値を返します。コード内で項目を指定するには、通常 Object を項目の実行時のデータ型に変換する必要があります。変換の方法は、Option Strict ステートメントで指定されている型チェック スイッチの設定によって異なります。
オブジェクトの暗黙の変換
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 関数を使用して変換を実行できます。
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 メソッドで確実にこれを実行できる場合、厳密に型指定されたコレクションを持っていることになるので、その場合には戻り値を Item プロパティから実行時のデータ型に変換する必要はありません。これにより、パフォーマンスが向上します。
独自のコレクション クラスを作成することによって、追加プロパティ、メソッド、およびイベントなど、より信頼性の高い機能を提供できます。詳細については、「方法 : クラス内にコレクションを定義する」を参照してください。