#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, поэтому он не врет.
Комментариев нет:
Отправить комментарий