概念的には、KeyValuePair<TKey,TValue>
は単なる変数のペアでありKey
、Value
。Microsoftが公開されたパブリックフィールドでそれを実装していたらKey
、Value
そのセマンティクスは完璧だったでしょう。制御変数として使用した場合、ForEach
不変でしたが、一方が他方を更新しなくても、通常の変数または配列要素のKeyまたはValueフィールドを更新できた可能性があります。
残念ながら、Microsoftは、フレームワーク型がパブリックフィールドを公開することを望んでいないようKeyValuePair<TKey,TValue>
ですDrawing.Rectangle
。(2)その状態全体が固定されたプロパティのセットに表示され(オブジェクトの状態を定義するもの以外に他の計算されたプロパティが存在する場合があります)、(3)それらのプロパティにはタイプに適した値の任意の組み合わせを割り当てることができます。したがって、Microsoftは、型の状態を構成するメンバーを読み取り専用プロパティまたは読み取り/書き込みプロパティとして公開する可能性のみを考慮しました。読み取り/書き込みプロパティを使用すると、次のようなコードになります。
for each (var item in myDictionary)
item.Value += 1;
また
...assuming MyList is a List<Drawing.Rectangle>
MyList[3].Width += 9;
既存のC#コンパイラによって次のいずれかとして解釈されます
for each (var item in myDictionary)
{ var temp = item; temp .Value += 1; }
また
...assuming MyList is a List<Drawing.Rectangle>
{ temp = MyList[3]; temp.Width += 9; }
どちらも恐ろしい振る舞いを生み出しますが、これはプログラマーが意図したものではないことはほぼ間違いありません。.netの実装者は、のメンバーをKeyValuePair<TKey,TValue>
個別に変更可能にすることの価値は、前者がもたらす危険を正当化するものではないと判断しましたが、の個々のメンバーを変更することの有用性はRectangle
、2番目がもたらす危険を正当化するのに十分でした。プロパティセッターを呼び出した場合でも、一時構造体のフィールドへの書き込みは許可されていなかったため、タイプがプロパティではなく公開フィールドを使用していれば、どちらの例も危険をもたらす必要はなかったことに注意してください。