__box
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 Conversion boxing implicite 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.
__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);
}