ここでは、コレクションを使用する際に起きる一般的な問題についていくつか説明します。
間違った型のコレクションの使用
Visual Basic で開発を行う場合、利用できるコレクションにはいくつかの種類があります。Visual Basic の Collection クラスと、.NET Framework に用意されている各コレクション クラスを使用できます。 これらのクラスは互いに互換性がありません。 つまり、変数をあるコレクション型で宣言した場合、その変数には別の型のオブジェクトを代入できません。 また、自分が宣言したコレクション型のメソッドとプロパティにしかアクセスできません。
Visual Basic と .NET Framework のコレクション クラスの主な違いは以下のとおりです。
インデックス番号。 .NET Framework のコレクションは、インデックス番号が 0 から始まりますが、Visual Basic のコレクションは、インデックス番号が 1 から始まります。 つまり、Visual Basic のコレクションでは、要素が 1 から Count プロパティの値までのインデックス値を持つのに対し、.NET Framework のコレクションでは、要素が 0 からコレクションの Count プロパティより 1 小さい値までのインデックス値を持ちます。
要素の型。 Visual Basic のコレクションは Object 型の要素をサポートしますが、これにはどのデータ型の要素でも追加できるため、タイプ セーフではありません。 通常、これはパフォーマンスの低下を招きます。なぜなら、コンパイラが要素を ボックス化およびボックス化解除して、オブジェクト型 (Object)と相互に変換することが必要になるからです。 .NET Framework のコレクションの中にも、Object 型の要素を持つものもありますが、それ以外の大半は、厳密に型指定された要素を持ちます。つまり、固有の型の要素をサポートします。このため、タイプ セーフなコレクションとなり、通常は最適なパフォーマンスを実現できます。
キー付きの要素。 Visual Basic のコレクションでは、要素をコレクションに追加するときにキーを指定できます。 キーは一意の String 値です。作成後にこれを使用して、特定の要素にアクセスできます。 .NET Framework のコレクションでは、キーの扱いはさまざまです。 キーをサポートするものとしないものがあります。
各種コレクション クラスの定義を含む名前空間を次に示します。
Microsoft.VisualBasic — Visual Basic の Collection クラス
System.Collections — リスト、キュー、ビット配列、ハッシュ テーブル、およびディクショナリなどの特殊なコレクション クラス
System.Collections.Generic — ジェネリック コレクション クラス。厳密に型指定されたコレクションの作成と、コレクション作成時の要素のデータ型の指定が可能
System.Collections.Specialized — 特殊かつ厳密に型指定されたコレクション クラス。リンクされたリストとハイブリッド ディクショナリ、ビット ベクターと名前オブジェクトのコレクション、および文字列のみのコレクションなど
正しい方法
どの型のコレクションが自分の要件に最も適しているかを判断します。 コレクション変数をその型で宣言します。オブジェクトも必ず同じ型で作成してください。 目的のコレクション型を確実に指定するために、コレクションを完全に修飾します。 2 つのコレクションを完全に修飾して宣言する例を、次に示します。
Dim customers As New Microsoft.VisualBasic.Collection()
Dim stringQueue As New System.Collections.Generic.Queue(Of String)
特定の型のコレクションを作成したら、その型に定義されたメソッドとプロパティだけを使用していることを確認します。 Option Strict On を設定すると、不正なオブジェクトの代入やメンバーへのアクセスを、コンパイル時にキャッチできます。