2009-11-09 11 views

答えて

16

ここにはanswerです。辞書 スロー

主な理由は、キーは常に参照 タイプであるため、ハッシュテーブルは はnullを返すことができる任意のV. 上で動作なし「エラー」 値がないことです。

+0

価値があります: 'HashTable'はこのようにunsafeコードを書くことができます。 'var ht = new Hashtable(){{" A "、null}}; 文字列aVal =(文字列)ht ["A"]; string bVal =(string)ht ["B"]; 'どちらも' null'を返します。有効な値と存在しないキーを区別することはできません。少なくともバグは隠されていて、さらに悪いですが、辞書は例外を教えてくれます。 –

6

辞書[key]の値がnull値を格納するときとキーが存在しないときの間に曖昧さはありません。 Hashtable [key]は、nullを格納するかキーが存在しない場合にnullを返します。

2

辞書がスローする主な理由は、政治的です。効率性と使いやすさを保つためのいくつかの選択肢があります。実際には、妥当な値を返すと主張されている「不能性」についての主張は誤りであることを明確に証明するメソッド(TryGetValue)を提供します。しかし、TryGetValueは、インデクサーが簡単に行うことができたことを明確にするために、はっきりとした厄介な構文を強制します。

C#テンプレートは、参照セマンティクスと値セマンティクスのための別々の実装を簡単に構築する方法を提供します。また、テンペットや一部の演算子で使用されるバリューセマンティスの欠けているオブジェクトをシームレスに処理する2つの機能があります。ハッシュテーブルのセマンティクスを破る合理的な理由がないことを意味します。

このような人為的な手続きが非効率的であり、スレッドの安全性が損なわれるということは、誰もが "あなたにはありますか"というチェックと現実的な事実を主張するコレクションの学術的概念との長期的な政治的闘争です(アクセスを非アトミックにすることで、安全性の高い実装のスレッド安全性が損なわれます)。

+2

'TryXX'パターンは、失敗した場合にメソッドが' default(T) 'を返すように指定し、' out bool'パラメータを使用してそれが働いたかどうかを示します。これは 'book ok; var theValue = myDict.TryGetValue(myKey、out ok); if(ok)... '。このようなパターンは、型推論と共分散の両方を可能にし、存在しないキーに対する望ましい振る舞いが 'default(T)'の値をとる場合を容易にします。 – supercat

関連する問題