2017-12-17 8 views
0

クラスをキーとインデックスとする辞書があり、項目が存在する場合はその項目を返し、それ以外の場合はnullを返すとします。どちらが効率的ですか?キーが存在するかどうかを確認するよりも効率的にKeyNotFoundExceptionをキャッチしていますか?

if(myDictionary.ContainsKey(myKey)) 
    return myDictionary[myKey]; 
return null; 

または

try { return myDictionary[myKey]; } 
catch { return null; } 
+2

私が推測すると、スタックを巻き戻すことはハッシュルックアップよりも高価です。見つけ出す方法は一つしかありません! –

+4

'if(myDict.TryGetValue(k、out v))return v;のような' TryGetValue'をいつでも使うことができます。そうでない場合はnullを返します。 ' – dcg

+3

例外を回避する方法がある場合は、それを使用してください。 – Steve

答えて

3

効率はソフトウェア開発において考慮されるべき問題であるが、それは一つだけではありません。性能要件や組み込み機器やモバイル機器のバッテリ節約といったいくつかの制限がない限り、通常は他の非機能要件が優先されます。メンテナンス性(およびコードの理解可能性)は、通常、より高い優先度を持ちます。

これを考慮すると、自分自身を1つのオプションに限定するべきではありません。値が辞書に存在しない場合は、エラーでない場合はTryGetを使用してください。不足している値をエラーと見なす場合は、インデクサーを使用します。

実際に実装するためにthe reference sourceをチェックすると、インデクサーとTryGetの両方がFindEntryから値を取得すると言われています。 TryGetがデフォルト値(安価)を取得して戻ります。インデクサーは返すだけではなく、さらにが例外をスローします。それはそれをより高価にします。

関連する問題