Все ли объекты имеют значение по умолчанию?
Абсолютно нет. Например, строка «abc» является объектом, но не имеет «значения по умолчанию». Число 12 является объектом, но у него нет «значения по умолчанию».
Однако все типы имеют значение по умолчанию. Помните, что объекты являются экземплярами типов; объекты существуют во время выполнения. Типы - это концепция времени компиляции. Не путайте типы с объектами; они отличаются от строки "The New York Times" и фактической копии сегодняшней New York Times.
Значения, которые могут храниться в переменной типа reference , являются либо ссылками на объекты , либо null . Отсюда и название «ссылочный тип»: значение переменной типа reference является reference (или null).
Значения, которые могут храниться в переменной типа значение , представляют собой объекты , которые являются значениями этого типа. Отсюда и название «тип значения» - значение переменной типа значения является значением .
(я опускаю типы указателей в обсуждении; для наших целей предположим, что все типы указателей логически совпадают с типом значения IntPtr.)
Значением по умолчанию для любого ссылочного типа является нулевое ссылочное значение.
Значением по умолчанию для любого типа числовых значений - int, decimal и т. Д. - является ноль этого типа. (Типы, которые поддерживают множественные представления нуля, такие как float, выбирают положительный ноль.) Значение по умолчанию bool - false. Значением по умолчанию любого типа значения, допускающего значение NULL, является значение NULL этого типа значения.
Значение по умолчанию для любого другого типа значения рекурсивно определяется как значение этого типа, сформированное путем установки для всех полей типа их значений по умолчанию.
Это ясно?