Меня смущает то, что происходит в стеке и куче в отношении свойств типа значения в классах.
Мое понимание до сих пор:
Когда вы создаете класс со структурой (типом значения) следующим образом:
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 в куче. Это имеет смысл для меня, но я начинаю терять его, когда мы рассматриваем возможность изменения целого числа Number в классе BarStruct внутри объекта Foo. Например:
Foo fooObj = new Foo();
fooObj.BarStruct.Number = 1;
Насколько я понимаю, это должно возвращать копию BarStruct для жизни в стеке, что означает, что любые изменения члена BarStruct не будут перенесены в объект, поэтому последняя строка выше дает ошибку.
Это правильно до сих пор?
Если это так, мой вопрос в том, как получилось такое задание:
fooObj.BarStruct = new Bar(2);
...действителен и изменяет значение кучи? Наверняка это просто изменение значения в стеке?? Кроме того, (постепенно) я нахожу настолько запутанным, что вы можете использовать new для типа значения. Для меня новое предназначено для выделения в куче (согласно C++) и кажется неестественным делать это для элементов в стеке.
Итак, просто чтобы повторить вопрос, правильно ли я предполагаю, что происходит, когда вызывается свойство, содержащее структуру, и почему вы можете назначить новую структуру для копии, и все же это изменяет ссылку на кучу?
Очень надеюсь, что все это имеет смысл.
Пишите, если вам нужны разъяснения!
Ta,
Энди.