Упаковка-преобразование - процесс преобразования структурного(значимого) типа в ссылочный тип ValueType
, Object
или любой другой тип интерфейса, реализуемый этим типом, для сохранения значения в куче. (Подробнее о структурах: Структура | Structure).
Зачастую лучше использовать изначальное создание структуры сразу либо на стеке (если она небольшая), либо в управляемой куче (если она большая), так как создание\упаковка множества мелких структур ссылочного типа в памяти может привести к задержкам выполнения программы (особенности работы Garbage Collector, которому нужно будет проверить актуальность использования всех ссылок в управляемой куче).
Создание переменной структурного типа:
int a = 42;
Упаковка-преобразование в тип Object
.
Tip: Упаковка-преобразование является неявной.
object b = a;
Распаковка-преобразование. Извлечение структурного типа из Object
.
Tip: Распаковка-преобразование является явной.
int c = (int)b;
Важно! Распаковка может производиться исключительно в тот тип, из которого была осуществлена упаковка. Так как при распаковке среда выполнения проверяет совместимость между объектом и структурой, в которую будет происходить распаковка.
Концепция упаковки и распаковки лежит в основе единой системы типов C#, в которой значение любого типа можно рассматривать как объект.
Упаковка (boxing) предполагает преобразование объекта значимого типа (например, типа int) к типу object. При упаковке общеязыковая среда CLR обертывает значение в объект типа System.Object
и сохраняет его в управляемой куче (хипе). Распаковка (unboxing), наоборот, предполагает преобразование объекта типа object к значимому типу. Упаковка и распаковка ведут к снижению производительности, так как системе надо осуществить необходимые преобразования.