クラスの値型プロパティに関して、スタックとヒープで何が起こっているのか混乱しています。
これまでの私の理解:
次のような構造体 (値型) を持つクラスを作成すると、次のようになります。
class Foo
{
private Bar _BarStruct;
public Bar BarStruct
{
get {return _BarStruct; }
set {_BarStruct = value; }
}
}
private struct Bar
{
public int Number;
Bar()
{
Number = 1;
}
Bar(int i)
{
Number = i;
}
}
次のようにクラス インスタンスを作成する場合:
Foo fooObj = new Foo();
スタックとヒープは次のようになります。
...Bar 構造体がヒープ内の Foo クラスに埋め込まれている場所。これは私には理にかなっていますが、Foo オブジェクト内で BarStruct クラスの Number 整数を変更することを検討すると、それが失われ始めます。例えば:
Foo fooObj = new Foo();
fooObj.BarStruct.Number = 1;
私が理解しているように、これは BarStruct のコピーを返してスタック上に置く必要があります。つまり、BarStruct のメンバーの変更はオブジェクトに反映されないため、上記の最後の行でエラーが発生します。
ここまででいいの?
もしそうなら、私の質問は、どうしてこのような割り当てが来るのかということです:
fooObj.BarStruct = new Bar(2);
...有効で、ヒープ値を変更しますか? 確かに、これはスタック上の値を変更しているだけですか?? また、(次第に)値型で new を使用できるのは非常に紛らわしいと思います。私にとって、new は (C++ のように) ヒープに割り当てるためのものであり、スタック上のアイテムに対してこれを行うのは不自然に感じます。
質問を繰り返しますが、構造体を含むプロパティが呼び出されたときに何が起こるか、新しい構造体をコピーに割り当てることができるのに、ヒープの参照が変更されるのはなぜですか?
これがすべて理にかなっていることを本当に願っています。
説明が必要な場合は叫んでください!
タ、
アンディ。