2013-03-31 8 views
5

"Multi value Dictionary"という複数の答えは、TValueとしてDictionary<TKey, TValue>クラスに不変クラスを使用することを提案しています。なぜディクショナリに不変の値を使用しますか?

受け入れられたJon Skeet's answerは、読み取り専用のプロパティを持つクラスPairと、変更不可能なTupleを使用する@teedyay's answerを提案しています。

このようなアプローチの理論的根拠は?

および担保質問:
なぜto make TFirst and TSecond readonlyそれぞれの特性を第1、第2は、とにかくセッターを持っていない場合:

private readonly TFirst first; 
private readonly TSecond second; 

public TFirst First 
{ 
    get { return first; } 
} 

public TSecond Second 
{ 
    get { return second; } 
} 

更新:
を、私はそれらの値のためのカスタムクラスの辞書を使用しています。
そして、値が更新されています。
私がそれらを不変にする理由は何ですか?

私はLookup<TKey, TElement> Classも不変であることがわかり、私はLINQクエリを使用していくつかの利点欠場することを考え(?)をもしそうなら
は、あなたは私が何を欠場かに私に例を与えることができますか?

+0

最初はセッターを持っていないかもしれませんが、読み取り専用でない場合は、最初に直接設定することを制限しません。 – Robert

+1

teedyayの答えは、「タプル」の不変性は付随的であり、「タプル」は2つの値をペアにする最も単純な方法です。彼が別の機会に書いた 'Pair'タイプのコードを投稿したときに、Jon Skeetの答えに付随することもあります。 –

+0

私は@DanielFischerに同意します。私はそれが会話に付随していると思います。特に、実装がGetHashCodeのオーバーライドを提供していると思います。変更可能な型のGetHashCodeをオーバーライドする警告があります。 –

答えて

1

2番目の質問の回答は、メンバー変数がreadonlyキーワードなしで設定可能であり、クラス自体内でのみ設定可能ですが、それでも可能です。

ところで、このクラスはstructの固体候補のようです。

4

基本的に、不変性によって、私の経験ではさまざまなことが読みやすくなります。たとえば、JavaのCalendarクラスとDateクラスの大きな問題点の1つは、その変更可能性です。それらが変更可能であることを忘れるのは簡単ですが、の参照のコピーをコンストラクタに入れて、参照があるオブジェクトを別のものに変更することがあります。だから、たとえ何ものオブジェクトを変更しようとしても、守備的なコピーをとることになります...それはすべて非常に迷惑になります。

もちろん、変更の時期がありますが、多くの場合、不変性は単純により良いです。

関連する問題