__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