方法 : タイプ セーフなコレクションの定義

更新 : 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 要素を返すので、弱い型指定および遅延バインディングの欠点があります。

参照

概念

Visual Basic のコレクション クラス

Visual Basic におけるコレクション

Visual Basic におけるジェネリック型

参照

System.Collections

System.Collections.Generic

System.Collections.Specialized

Option Strict ステートメント