Pregunta

Cita del Enlace MSDN para ValueType Class

  

En los casos en que es necesario que un tipo de valor se comporte como un objeto, un contenedor que hace que el tipo de valor parezca un objeto de referencia se asigna en el montón, y el valor del tipo de valor se copia en él. La envoltura está marcada para que el sistema sepa que contiene un tipo de valor.

Esto significa que cuando código como " integerVariable.ToString (); " un objeto envoltorio creado permite usar este método y, de manera similar, todos los otros métodos de System.Object.

  

¿Es correcto este entendimiento?

     

¿En qué se diferencian estos objetos de los objetos 'normales'?

     

¿Es la recolección de basura diferente para tal objeto? Si es así, ¿cómo?

Gracias de antemano.

¿Fue útil?

Solución

El contenedor es una "caja". re recolección de basura de cajas: no existe ninguna diferencia en lo que respecta al recolector de basura. Se recoge una caja con exactamente las mismas reglas y el mismo tratamiento que cualquier otro objeto.

sin embargo, si un tipo de valor invalida un método (como ToString () ), no es necesario encuadrarlo para llamar al método. Por lo tanto, los tipos de valor deben (como cuestión de rutina) anular tantos métodos de objeto como sea posible ;-p

Puede ver la diferencia en la IL (a través del reflector), por lo que para 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();
}

Tenemos el 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 
}

Tenga en cuenta que ToString () no incluye un cuadro, pero GetType () sí lo hace en L_0007 (ya que no lo es ( no puede ser) anulado)

Otros consejos

Sí, esa comprensión es correcta.

Estos objetos no son diferentes de los objetos 'normales' en el CLR.

Dado que estos objetos (también llamados 'cajas' porque envuelven tipos de valor) son como cualquier otro objeto, el recolector de basura también es el mismo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top