Страницы

Поиск по вопросам

суббота, 4 января 2020 г.

Инициализация значимых типов в C#

#c_sharp #net #clr


Читаю книгу, написанную Дж. Рихтером, CLR via C#. К сожалению, в самом начале у меня
возникают вопросы. Надеюсь, вы поможете мне разобраться.

Джеффри пишет, что различие между значимыми и ссылочными типами заключается в том,
что значимые типы хранятся в стеке потока, в то время как ссылочные типы хранятся по
принципу: объект типа лежит в управляемой куче, а ссылка на этот объект находится в
стеке. Далее он говорит, что ссылка на объект ссылочного типа возвращается оператором
'new'. А для значимых типов возвращать ссылку не нужно, поэтому можно не писать оператор
'new'. 

Дж. Рихтер приводит пример:

struct SomeVal { public Int32 x; } // здесь он объявляет структуру
SomeVal v1 = new SomeVal();


Потом он добавляет, что строку выше можно записать иначе:

SomeVal v1;


Дословно:


  Здесь тоже создается IL-код, который помещает экземпляр SomeVal в стек
  потока и обнуляет все его поля.


Подскажите, правда ли это? Ведь мы же не можем обратиться к какому-нибудь полю структуры
до тех пор, пока не выполним его инициализацию. А по словам Джеффри выходит, что ничего
инициализировать не нужно, ведь все поля сами обнуляются.
    


Ответы

Ответ 1



Это правда. Вся выделенная память просто инициализируется нулями. Ведь мы же не можем обратиться к какому-нибудь полю структуры до тех пор, пока не выполним его инициализацию. Это проверка C# компилятора, CLR же не накладывает таких ограничений. Книга Рихтера -- она же в первую очередь о CLR, поэтому он не врет.

Комментариев нет:

Отправить комментарий