Partager via


__box

 

Publication: mars 2016

Notes

Cette rubrique s’applique uniquement à la version 1 des extensions managées pour C++. Cette syntaxe doit être utilisée uniquement pour conserver le code de la version 1. Consultez Boxing (C++ Component Extensions) Pour plus d’informations sur l’utilisation de la fonctionnalité équivalente dans la nouvelle syntaxe.

Crée une copie managée d'un objet classe __value.

Syntaxe

__box(
value-class identifier
)

Notes

Le mot clé __box est utilisé pour créer un objet managé (dérivé de System::ValueType) à partir d'un objet classe__value existant. Lorsque le mot clé __box est appliqué à une classe__value :

  • Un objet managé est alloué sur le tas du Common Language Runtime.

  • La valeur actuelle de l'objet classe__value est copiée au niveau du bit dans l'objet managé.

  • L'adresse du nouvel objet managé est retournée.

Ce processus est appelé « boxing ». Cela permet à tout objet classe__value d'être utilisé dans les routines génériques qui fonctionnent pour tout objet managé car l'objet managé hérite indirectement de System::Object (puisque System::ValueType hérite de System::Object).

Notes

L'objet boxed nouvellement créé est une copie de l'objet classe__value. Par conséquent, les modifications apportées à la valeur de l'objet boxed n'affectent pas le contenu de l'objet classe__value.

Exemple

Voici un exemple qui effectue la conversion boxing et unboxing :

// 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);
}

Dans l'exemple suivant, un type de valeur non managé (V) est boxed et passé comme paramètre managé à la fonction 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);
}
10 20