Question

Citation tirée du lien MSDN pour la classe ValueType

  

Dans les cas où il est nécessaire qu'un type de valeur se comporte comme un objet, un wrapper qui lui donne l'apparence d'un objet de référence est alloué sur le segment de mémoire et la valeur du type de valeur y est copiée. Le wrapper est marqué pour que le système sache qu'il contient un type de valeur.

Cela signifie que, lorsque je code comme "" integerVariable.ToString ();" un objet wrapper créé permet d'utiliser cette méthode et de la même manière que toutes les autres méthodes de System.Object.

  

Cette compréhension est-elle correcte?

     

En quoi ces objets sont-ils différents des objets "normaux"?

     

La collecte des ordures est-elle différente pour un tel objet? Si oui, comment?

Merci d'avance.

Était-ce utile?

La solution

Le wrapper est une "boîte" ;; En ce qui concerne le ramassage des ordures dans les bacs - il n'y a pas de différence en ce qui concerne le grappin Une boîte est collectée avec exactement les mêmes règles et le même traitement que tout autre objet.

Cependant, si un type de valeur remplace une méthode (telle que ToString () ), il n'est pas nécessaire de la mettre en boîte pour appeler la méthode. Par conséquent, les types de valeur doivent (en routine) remplacer autant que possible les méthodes object ;-p

Vous pouvez voir la différence dans le IL (via le réflecteur) - donc pour le C #:

static int GetInteger() {return 123;}
static string TestToString() {
    int i = GetInteger(); // to prove no cheating
    return i.ToString();
}
static Type TestGetType() {
    int i = GetInteger(); // to prove no cheating
    return i.GetType();
}

Nous avons l'IL:

.method private hidebysig static string TestToString() cil managed
{
    .maxstack 1
    .locals init (
        [0] int32 i)
    L_0000: call int32 Program::GetInteger()
    L_0005: stloc.0 
    L_0006: ldloca.s i
    L_0008: call instance string [mscorlib]System.Int32::ToString()
    L_000d: ret 
}

.method private hidebysig static class [mscorlib]System.Type TestGetType() cil managed
{
    .maxstack 1
    .locals init (
        [0] int32 i)
    L_0000: call int32 Program::GetInteger()
    L_0005: stloc.0 
    L_0006: ldloc.0 
    L_0007: box int32
    L_000c: call instance class [mscorlib]System.Type [mscorlib]System.Object::GetType()
    L_0011: ret 
}

Notez que ToString () n'implique pas de boîte, mais GetType () utilise L_0007 (car ce n'est pas le cas ( ne peut pas être) écrasé)

Autres conseils

Oui, cette compréhension est correcte.

Ces objets ne sont pas différents des objets "normaux" du CLR.

Etant donné que ces objets (également appelés 'boîtes' parce qu'ils enveloppent les types de valeur) sont comme n'importe quel autre objet, le garbage collector est le même.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top