方法 : タイプ セーフなコレクションの定義
更新 : 2007 年 11 月
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)
これを実行すると、コレクションの要素が widget 型ではないため、後続のコードで要素を取得しようとすると実行時に ArgumentException 例外がスローされます。
タイプ セーフの問題からの保護
ジェネリック クラスを定義することにより、タイプ セーフを最大限にすることをお勧めします。厳密な型指定が強制されると同時に、操作する特定のデータ型に柔軟性を与えることができます。詳細については、「Visual Basic におけるジェネリック型」を参照してください。
クラス内にタイプ セーフなコレクションを定義するには
System.Collections.Generic 名前空間内のジェネリック クラスの 1 つ、たとえば List<T> をコレクション クラスの代わりに使用します。これで、widget メンバのみに制限されるコレクションを作成できます。次のコード例は、前記の例の宣言を変更してジェネリック コレクションを作成する方法を示します。
Public widgetColl As New System.Collections.Generic.List(Of widget)
このようにすると厳密な型指定が強制されるため、widget アイテムだけをコレクションに追加できるようになり、Item プロパティを使って取得される要素は常に widget オブジェクトです。また、厳密な型指定があるので、取得元のコードでは、widget から公開されるすべてのプロパティとメソッドを使用できます。
または
定義済みのクラスを使わずに、独自のコレクション クラスを作成します。Add メソッドが widget オブジェクトだけを受け付けるように制限し、戻り値の型を widget として Item プロパティを実装します。詳細については、「方法 : タイプ セーフなコレクションの定義」を参照してください。
もし 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 では遅延バインディングが使用され、パフォーマンスが低下します。
Visual Basic の Collection クラスは Object 要素を受け取り、Object 要素を返すので、弱い型指定および遅延バインディングの欠点があります。