質問の歴史
.NET Frameworkの登場により、Visual Basicは型安全で高速なキーと値のペアを格納する構造体であるDictionary(Of TKey, TValue)を獲得しました。これは迅速な検索のための標準的な連想コンテナです。
問題
辞書の操作は、しばしばエラーを引き起こします:存在しないキーを介して値にアクセスしようとすると、例外が発生します。また、値の追加、変更、新しい値の追加の操作が混同されることがよくあります。
解決策
値にアクセスするためには、インデクサまたはメソッドTryGetValue、ContainsKeyを使用します。KeyNotFoundExceptionを回避するために、常に明示的なチェックを行ってください:
コードサンプル:
Dim dict As New Dictionary(Of String, Integer)() dict.Add("one", 1) dict("two") = 2 ' 新しいペアの追加 If dict.ContainsKey("three") Then Console.WriteLine(dict("three")) ' エラーを引き起こさない Else Console.WriteLine("キーが見つかりません") End If Dim value As Integer = 0 If dict.TryGetValue("one", value) Then Console.WriteLine(value) End If
主な特徴:
dict("キー")は常に新しいキーと値のペアを追加するのは本当ですか?
いいえ。キーが存在する場合、値が更新されます。存在しない場合はペアが追加されます。キーが存在する場合にエラーを出して追加するには、Addを使用します。
TryGetValueは、キーがない場合に例外をスローしますか?
いいえ。例外を発生させることなくFalseを返し、valueは変更されません。これは安全なアクセス方法です。
Dictionaryに値型(例えば、Integer)をTValueとして格納し、存在しないキーに対してnullを取得することはできますか?
いいえ。値型の場合、型のデフォルト値(Integerの場合は0)が返されますが、インデクサを通じてアクセスするとキーが存在しない場合は例外が発生します。
インデックスで辞書にアクセスする際に事前チェックが行われず、さまざまな場所で重複し、アプリケーションの定期的なクラッシュを引き起こします。
利点:
欠点:
TryGetValueの普遍的な使用、すべてのアクセスが保護され、キーが存在しない場合の処理が論理的に行われます。
利点:
欠点: