Возврат значения вводит от свойства

Я запутываюсь с тем, что, оказывается, на стеке и "куче" в уважении оценивает свойства типа в классах.

Мое понимание до сих пор:

При создании класса со структурой (оцените тип) как это:

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();

Стек и "куча" будут похожи на это:

https://i962.photobucket.com/albums/ae105/acardy/stackheap-1.jpg(https://i962.photobucket.com/albums/ae105/acardy/stackheap-1.jpg)

... где структура Панели встраивается в класс Foo в "куче". Это имеет смысл мне, но я начинаю освобождать его, когда мы рассматриваем изменение целого числа Числа в классе BarStruct в Объекте Foo. Например:

Foo fooObj = new Foo();
fooObj.BarStruct.Number = 1;

Как я понимаю, это должно возвращать копию BarStruct для проживания на стеке, что означает, что любые изменения члена BarStruct не несли бы до объекта, который является, почему последняя строка выше дает ошибку.

Действительно ли это правильно до сих пор?

Если так, мой вопрос, каким образом присвоение, такое как это:

fooObj.BarStruct = new Bar(2);

... допустимо и изменяет значение "кучи"? Конечно, это просто изменяет значение на стеке?? Кроме того, (вскоре) я нахожу его настолько сбивающим с толку, что Вы можете использовать новый на типе значения. Мне, новый для выделения на "куче" (согласно C++) и чувствует себя неестественным для выполнения этого для объектов на стеке.

Таким образом, только для повторения вопроса я корректен в своем предположении о том, что происходит, когда свойство, содержащее структуру, называют и почему можно присвоить новую структуру копии, и все же это все еще изменяет ссылку на "куче"?

Действительно надеюсь, что это все имеет смысл.

Вопль, если Вам нужно разъяснение!

Ta,

Andy.

9
задан Community 8 February 2017 в 14:19
поделиться

1 ответ

Глядя на это присваивание:

fooObj.BarStruct = new Bar(2);

Присваивание не изменяет значение в стеке - оно вызывает setter для свойства.

Другими словами, в то время как ваше первое присваивание эквивалентно:

fooObj.get_BarStruct().Number = 1; // Bad

второе эквивалентно:

fooObj.set_BarStruct(new Bar(2));

Помогает ли это?

Обратите внимание, что проблемное присваивание становится невыполнимым, если вы делаете ваш тип значения неизменяемым, что, в общем-то, помогает на самом деле. Мутируемые типы значений - это действительно плохая идея в C#; с ними не может быть никаких проблем.

С точки зрения ваших ожиданий "нового" - постарайтесь не думать на C++, в принципе. C# - это не C++, и различные вещи (деструкторы, дженерики, поведение во время построения) запутают вас, если вы попытаетесь эффективно писать C++ на C#. Новое" утверждение создает новый экземпляр типа, будь то тип значения или ссылочный тип.

.
10
ответ дан 4 December 2019 в 21:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: