クラスタイプの変数、パラメーター、フィールド、戻り値、またはその他のそのような保存場所は、「オブジェクト ID」を保持していると考えるべきです。あるオブジェクトに、 field によってサポートされる何らかのクラス タイプのFoo
呼び出されたプロパティがあり、 "object id#24601"を保持している場合、ステートメントはオブジェクト #24601 のセッターを "George" の値で呼び出します。このステートメントはオブジェクト自体を変更しないことに注意してください (そのフィールドは、ステートメントの実行前に「object id#24601」を保持し、その後も保持します)。ただし、オブジェクト #24601 に影響を与える可能性があります。Bar
_Bar
_Bar
Foo.Bar.Text = "George"
Text
Foo
_Bar
構造体型の格納場所は、そのすべてのフィールド (パブリックとプライベートの両方) の内容を保持していると考える必要があります。が type (構造体)Foo.Boz
のプロパティであり、バッキング フィールド である場合、 へのアクセスにより type の新しい一時インスタンスが作成され、そのすべてのフィールドが のフィールドからコピーされます。読み取りを試みると、のすべてのフィールドが一時インスタンスにコピーされ、そのインスタンスのフィールドにアクセスされます。Rectangle
_Boz
Foo.Boz
Rectangle
Foo._Boz
Foo.Boz.X
_Boz
X
一部の非常に古くて邪悪な C# コンパイラは、 のようなコードを解釈Foo.Boz.X = 5;
しRectangle temp; temp.X = 5;
、結果の temp の値を破棄しますが、警告は発行しないことに注意してください。このようなコンパイラの動作により、一部の人々は構造体を「不変」にして、そのようなコードが偽の動作を生成するのではなくコンパイラ エラーを生成するように宣言しました。X
残念なことに、まともなコンパイラなら可変フィールドであってもそのようなコードを禁止するという事実にもかかわらず、その信念は今日まで続いています。
変更可能な構造体型のプロパティを更新する適切な慣用的な方法は次のとおりです。
Rectangle temp = MyListOFRectangles[5];
temp.X = 5;
MyListOFRectangles[5] = temp;
Rectangle
が という名前のパブリック整数フィールドを持っていることがわかっていて、 がX
でMyListOfRectangles
ある場合、の他のプロパティ、コンストラクタなどList<Rectangle>
について知る必要はありません。上記のコードが変更されるが、他のプロパティには影響しないことを知るためにの、またはのプロパティ。素晴らしく、明確で、簡単です。公開フィールド構造体を使用すると、他の種類のデータ型とは異なり、明確で一貫性のある方法で値を部分的に編集できます。Rectangle
MyListOfRectangles[5].X
MyListOfRectangles[5]
MyListOfRectangles[4]