Эта ссылка на MSDN, как представляется, указывает, что когда значение int?
(или любое Nullable<T>
) имеет значение, оно всегда помещается в поле (и следовательно, гораздо менее эффективное хранилище данных, чем память int
). Это тот случай?
С# int? и bool? s всегда в коробке, когда hasvalue = true?
Ответ 1
Эта страница относится к тому, когда вы боксируете структуру Nullable<T>
, а не значения внутри самой структуры.
Нет никакого бокса, участвующего в хранении типа с нулевым значением, пока вы не попробуете бокс с самой нулевой:
int? a = 42; // no boxing
int? n = null; // no boxing
object nObj = n; // no boxing
object aObj = a; // only now will boxing occur
Такое поведение ничем не отличается от того, как боксировать обычный тип значения (за исключением обработки нулевого случая), поэтому его действительно можно ожидать.
Ответ 2
Это не так. Nullable<T>
является общим, поэтому он содержит реальные int
или bool
.
Страница MSDN говорит о том, что происходит, когда вы вставляете Nullable<int>
или Nullable<bool>
. Если вы никогда не назначаете свою нулевую структуру переменной object
, вы не будете нести накладные расходы на бокс.
Ответ 3
Нет. Объект Nullable является общей структурой и внутренне обрабатывает значение T без бокса.