2009-05-20 3 views
9

another SO question, TryGetValueを常に使用するように勧められている人もいます。TryGetValueを使用して.net辞書にアクセスする必要がありますか?

私は常にContains?/ AccessパターンにTryGetValueを使用していますが、キーが常に辞書に存在すると想定しているので、意図的にこのパターンを避けています。直接インデクサーにアクセスして、予期しない何かが実際に起こった(キーが予想通りに辞書にない)ため、キーがないと例外が発生します。

「ベストプラクティス」(私はTryGetValueを常時使用することをアドバイスした投稿の4人のうち3人)に対して一般的なコンセンサスがあるようですので、私はそのトピック...

答えて

13

いいえ、あなたは完全に正しいです。

はやってでない点はありません:

if (dict.TryGetValue(key, out value)) 
{ 
    // whatever 
} 
else 
{ 
    throw new SomeException("key '" + key + "' wasn't in dictionary"); 
} 

そのオーバーの唯一の利点:

value = dict[key]; 

は、あなたがより明示的な例外メッセージを取得することです...しかし、読みやすさを犠牲にし、 IMO。

キャストとの比較は、asを使用しています。状態が「間違っている」場合は例外ですが、その動作を与えるフォームを使用してください。

+2

TryGetValue/throwを実行すると、例外メッセージに実際のキーを追加できます。これは、デフォルトのKeyNotFoundExceptionが(何かが欠けていない限り)実行できないものです。 – Skizz

1

キーが存在しない場合は例外ですが、例外を発生させても構いません。

0

辞書にキーが存在しないという例外的な動作(それはそうであると思われる)の場合、キーが見つからない場合に例外を発生させ、その例外をスタック。

Debug.Assert(Dictionary.ContainsKey(Key)); 

あなたが唯一本当にあなたがキーが存在しない状況、またはあなたの場合を期待する場合TryGetValueを使用する必要があります:あなたは守備のプログラミング手法を使用する場合は、辞書のキーにアクセスする前に、次のように使用することができますキーが存在しない場合に特定のコードを実行したい

2

キーが見つからないと予想される場合は、TryGetValueを使用すると、通常はよりクリーンで効率的なコードになります。キーが存在すると予想される場合は、直接インデックスアクセスが通常より優れています。例外はバグを示します。

ContainsKeyは、通常、対応する値が必要ない場合にのみ使用されます。

関連する問題