問題の歴史:
VB.NETでは、データの関連保存(キーと値)が可能な標準として、Dictionary(Of TKey, TValue)クラスが用いられます。従来のVB6では、Scripting.DictionaryオブジェクトやCollectionコレクション、さらには.NETの初期バージョンで登場したHashtableタイプが多く使用されました。これらの構造は、キーによる値の高速検索を可能にし、型安全性の低いアプローチを置き換えました。
問題
DictionaryとHashtableの間には、存在しないキーによる検索時の予期しない違いがあり、誤った操作を引き起こす可能性があります。例えば、存在しないキーへのアクセスを試みると、場合によってはエラーが発生し、また他の場合ではそうならないことがあります。また、型安全性とパフォーマンスの違いにより、コレクションの不適切な選択が行われることがあります。
解決策
現在のVB.NETバージョンでは、Dictionary(Of TKey, TValue)の使用が最良のプラクティスとされており、ここでTKeyとTValueは厳密に型指定されています:
Dim dict As New Dictionary(Of String, Integer)() dict.Add("apple", 1) dict.Add("banana", 2) If dict.ContainsKey("banana") Then Console.WriteLine(dict("banana")) ' 2を出力します End If ' 値の安全な取得 Dim value As Integer If dict.TryGetValue("cherry", value) Then Console.WriteLine(value) Else Console.WriteLine("そのキーは存在しません!") End If
主な特徴:
DictionaryでキーとしてObjectを制限なく使用できますか?
形式的には可能ですが、キーとして使用されるクラスでGetHashCodeとEqualsメソッドを正しく実装する必要があります。そうでない場合、衝突や検索エラーが発生する可能性があります。
dict("foo")を通じて存在しないキーにアクセスした場合、どうなりますか?
KeyNotFoundException例外がスローされます。キーを事前にチェックせず(ContainsKeyやTryGetValueを通じて)、プログラムはクラッシュします。
DictionaryとHashtableは要素の順序を同じようにサポートしていますか?
いいえ。どちらのクラスも要素の追加順序を保証しません。順序を保つには、SortedDictionary、OrderedDictionary、または他の構造を利用してください。
開発者がユーザーの大規模データを保存するためにHashtableを選択しました。捉えどころのないエラーが発生し、同じキーが常に一致するわけではなく、テストではObject.ReferenceEqualsエラーが発生し、不安定なタイプのキーが紐づいていました。
長所:
短所:
Dictionary(Of Guid, User)に移行しました:厳密な型指定、TryGetValueのサポート、衝突エラーを排除し、パフォーマンスが向上しました。
長所:
短所: