С# int? и bool? s всегда в коробке, когда hasvalue = true?

Эта ссылка на MSDN, как представляется, указывает, что когда значение int? (или любое Nullable<T>) имеет значение, оно всегда помещается в поле (и следовательно, гораздо менее эффективное хранилище данных, чем память int). Это тот случай?

Ответ 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 без бокса.