方法: タイプ セーフなコレクションの定義 (Visual Basic)
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 におけるジェネリック型 (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 プロパティを実装します。 詳細については、「方法: タイプ セーフなコレクションの定義 (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 で遅延バインディングが行われ、パフォーマンスが低下します。
Visual Basic の Collection クラスは、Object 要素を受け取ったり返したりするので、弱い型指定と遅延バインディングの欠点が適用されます。
参照
参照
System.Collections.Specialized