__box

Примечание

Этот раздел относится только к управляемым расширениям для C++ версии 1.Приведенный здесь синтаксис должен использоваться только для обслуживания кода версия 1.Сведения об использовании аналогичных функциональных возможностей в новом синтаксисе см. в разделе Неявная упаковка-преобразование.

Создает управляемую копию объекта класса __value.

__box(value-class identifier)

Заметки

Ключевое слово __box используется для создания управляемого объекта (производного от System::ValueType) из существующего объекта класса __value. Если применить ключевое слово __box к классу __value, произойдет следующее.

  • Управляемый объект выделяется в куче среды CLR.

  • Текущее значение объекта класса __value побитово копируется в управляемый объект.

  • Возвращается адрес нового управляемого объекта.

Этот процесс называется упаковкой-преобразованием. Это позволяет использовать любой объект класса __value в универсальных подпрограммах, применимых для любого управляемого объекта, так как управляемый объект косвенно наследуется от System::Object (поскольку System::ValueType наследуется от System::Object).

Примечание

Новый упакованный объект является копией объекта класса __value.Поэтому изменения значения упакованного объекта не влияют на содержимое объекта класса __value.

Пример

Ниже приведен пример упаковки-преобразования и распаковки-преобразования.

// keyword__box.cpp
// compile with: /clr:oldSyntax
#using < mscorlib.dll >
using namespace System;

int main() {
  Int32 i = 1;
  System::Object* obj = __box(i);
  Int32 j = *dynamic_cast<__box Int32*>(obj);
}

В следующем примере неуправляемый тип значения (V) упаковывается и передается в качестве управляемого параметра в функцию Positive.

// keyword__box2.cpp
// compile with: /clr:oldSyntax
#using <mscorlib.dll>
using namespace System;

__value struct V {
   int i;
};
void Positive(Object*) {}   // expects a managed class

int main() {
   V v={10};   // allocate and initialize
   Console::WriteLine(v.i);

   // copy to the common language runtime heap
   __box V* pBoxedV = __box(v);
   Positive(pBoxedV);   // treat as a managed class

   pBoxedV->i = 20;   // update the boxed version
   Console::WriteLine(pBoxedV->i);
}