такое C # int? и bool? s всегда в штучной упаковке, когда hasvalue = true? - PullRequest
11 голосов
/ 30 июня 2010

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

Ответы [ 3 ]

11 голосов
/ 30 июня 2010

Эта страница относится к тому, когда вы упаковываете структуру 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 голосов
/ 30 июня 2010

Нет. Объект Nullable является общей структурой и внутренне обрабатывает значение T без упаковки.

2 голосов
/ 30 июня 2010

Дело не в этом. Nullable<T> является общим, поэтому он содержит реальные int или bool.

На странице MSDN говорится о том, что происходит, когда вы ставите Nullable<int> или Nullable<bool>. Если вы никогда не назначите свою пустую структуру для переменной object, вы не будете подвергаться накладным расходам на бокс.

...