Читая про упаковку/распаковку на Википедии,
Распаковка ссылочного типа в значимый подразумевает, что это должно быть выполнено явно. При этом, необходимо во-первых, сначала удостовериться, что тип упакованного объекта по ссылке соответствует исходному, а во-вторых, скопировать поля данных упакованного объекта в новую переменную данного типа. Как правило, проверку соответствия типов осуществляют с помощью механизма генерирования и обработки исключений, после чего копирование переносит внутренние данные (поля) объекта из «кучи» в стек выполняемого приложения, где хранятся его локальные переменные. Последовательность конкретных действий сводится к следующим шагам:
если служебный указатель на упакованный значимый тип имеет значение null, то генерируется исключение NullReferenceException,
если упакованный объект не соответствует требуемому типу, то выбрасывается исключение InvalidCastException.
наткнулся на то, что тут говорят:
1. если служебный указатель на упакованный значимый тип имеет значение null, то генерируется исключение NullReferenceException.
Я правильно понимаю, что под "Служебный указатель на упакованный значимый тип", следует понимать "Указатель на объект-тип (TypeObjectPointer)"? И если я прав, разве TypeObjectPointer может быть когда либо равным null?
Имеется в виду скорее всего такой сценарий:
Object obj=(object)3;
obj=null;
var i=(int)obj;
А TypeObjectPointer
по идее никогда не может быть Null'ом, так как он есть во всех объектах и без него тогда бы было неизвестно какого типа объект перед CLR.
Даже сам System.Type ссылается сам на себя:
Of course, the system.type object is an object itself and therefore it also has a type object pointer member in it, and it is logical to ask what this member refers to. It refers to itself because the system.type object is itself an "instance" of a type object.
Я думаю, вы понимаете неправильно. Type Object Pointer — вероятно, указатель на экземпляр класса System.Type
, который создаётся компилятором для каждого класса, даже для абстрактного.
Есть статья, которая рассказывает, как этот указатель можно извлечь из заголовка объекта.
Он не может быть равен null
ни у какого объекта в куче.
О каком же служебном указателе речь? Попробуем найти исходник текст на английском языке. Это отрывок из книги Джеффри Рихтера CLR via C#:
Internally, here's exactly what happens when a boxed value type instance is unboxed:
1. If the variable containign the reference to the boxed value type instance is null, a NullReferencePointer
is thrown.
Как видите, никакого слова служебный в оригинале нет.
Речь конечно, идёт о том, что если вы пытаетесь привести null
к значимому типу, такому как int
, вы получите NullReferencePointer
.
Вторая проблема текста в том, что он не обновлялся по всей видимости с 2003 года. Уже в версии .NET 2 появился тип Nullable<T>
, который является значимым, но обрабатывается третьим способом. Если указатель на объект равен null
и приводится к int?
вы получите корректный значимый объект Nullable<Int32>
с установленным свойством IsNull
.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Всем привет, возникла задача добавить 3d сцену в окно формы в Visual studio, подскажите каким образом это можно реализовать?
Есть строка со словами $words = "аркада,мороженное,собака,камаз,главная,тренировка,робот,ёлка" Слова разделены запятыми, а в конце точка
Начав изучать Laravel и Lumen я пришел к выводу, что написать какой-никакой сайт получится быстроНо меня всё не покидает ощущения что я пишу го***код