Страницы

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

понедельник, 4 февраля 2019 г.

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

Читаю книгу, написанную Дж. Рихтером, CLR via C#. К сожалению, в самом начале у меня возникают вопросы. Надеюсь, вы поможете мне разобраться.
Джеффри пишет, что различие между значимыми и ссылочными типами заключается в том, что значимые типы хранятся в стеке потока, в то время как ссылочные типы хранятся по принципу: объект типа лежит в управляемой куче, а ссылка на этот объект находится в стеке. Далее он говорит, что ссылка на объект ссылочного типа возвращается оператором 'new'. А для значимых типов возвращать ссылку не нужно, поэтому можно не писать оператор 'new'.
Дж. Рихтер приводит пример:
struct SomeVal { public Int32 x; } // здесь он объявляет структуру SomeVal v1 = new SomeVal();
Потом он добавляет, что строку выше можно записать иначе:
SomeVal v1;
Дословно:
Здесь тоже создается IL-код, который помещает экземпляр SomeVal в стек потока и обнуляет все его поля.
Подскажите, правда ли это? Ведь мы же не можем обратиться к какому-нибудь полю структуры до тех пор, пока не выполним его инициализацию. А по словам Джеффри выходит, что ничего инициализировать не нужно, ведь все поля сами обнуляются.


Ответ

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

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

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