Упаковка и распаковка примитивных типов данных Упаковка и распаковка — важная концепция программирования в .NET вне зависимости от того, какой именно язык программирования вы используете. Одно из самых важных преимуществ .NET — унифицированная система типов. Каждый тип, в том числе простые упакованные встроенные типы, такие как _box (int), является потомком класса System.Object (Система.Объект). В языках, подобных Smalltalk, все типы являются объектами, но это приводит к неэффективности использования простых типов. В стандартном C++ простые встроенные типы данных и объекты обрабатываются по-разному, — это повышает эффективность использования типов, но исключает возможность унификации системы типов. Управляемый C++ объединяет преимущества обоих подходов, используя прием, называемый упаковкой (boxing). Упаковка — преобразование типов значений, таких, как int или double (с удвоенной точностью), в ссылку на объект, хранимый в динамически распределяемой области памяти. Упаковка производится с помощью ключевого слова _box. Распаковка — преобразование упакованного типа (хранимого в динамически распределяемой области памяти) в неупакованное значение (хранимое в стеке). Распаковка выполняется приведением типов. Проиллюстрируем упаковку и распаковку следующим фрагментом кода: int x = 5; // простой встроенный тип int
Ключевое слово _box создает в управляемой
динамически распределяемой области памяти
управляемый объект, инкапсулирующий копию
выражения, имеющего тип значения. Под
выражением, имеющим тип значения,
подразумевается примитивный тип данных,
такой как int, float (с плавающей точкой), double (с
удвоенной точностью), или char (символ), либо
тип значения, определенный как класс или
структура и описанный с использованием
ключевого слова _value (значение). Например,
предопределенный управляемый тип
_boxed_System_Int32 инкапсулирует упакованный int, a
управляемый тип _boxed_ValueStruct — упакованный
тип значения ValueStruct. Эти странные названия
типов (_boxed_System_Int32 и _boxed_ValueStruct) не
обязательно будут встречаться в вашем
исходном коде, но они показываются утилитой
Ildasm.exe. Обратите внимание, что _box int * —
альтернативное имя управляемого типа
_boxed_System_Int32, a _box ValueStruct* — альтернативное имя
управляемого типа _boxed_ValueStruct.
//BoxExample.срр
Приведенная программа напечатает: 10
|