コレクションのトラブルシューティング

更新 : 2007 年 11 月

ここでは、コレクションを使用する際に起きる一般的な問題についていくつか説明します。

間違った型のコレクションの使用

Visual Basic で開発を行う場合、Visual Basic の Collection クラスと .NET Framework に用意されているコレクション クラスを合わせた、さまざまな型のコレクションを使用できます。これらのクラスは互いに互換性がありません。つまり、変数をあるコレクション型で宣言した場合、その変数には別の型のオブジェクトを代入できません。また、自分が宣言したコレクション型のメソッドとプロパティにしかアクセスできません。

Visual Basic のコレクション クラスと .NET Framework のコレクション クラスには、次のような重要な違いがあります。

  • インデックス番号.NET Framework のコレクションは 0 ベースですが、Visual Basic のコレクションは 1 ベースです。つまり、Visual Basic のコレクションの要素は、1 から Count プロパティ (Collection オブジェクト) の値までのインデックス値を持ち、.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 を設定すると、不正なオブジェクトの代入やメンバへのアクセスを、コンパイル時にキャッチできます。

参照

概念

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

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

参照

Option Strict ステートメント