2012-04-14 11 views
5

He estado tratando de entender este párrafo, pero de alguna manera no podía virtualizar en mi mente, alguien por favor elaborarla poco:Valores Unboxing Tipos de objetos

Unboxing no es exactamente lo contrario de boxeo. La operación de unboxing es mucho menos costosa que el boxeo. Unboxing es realmente solo la operación de obtener un puntero al tipo de valor sin formato (campos de datos) que contiene dentro de un objeto. En efecto, el puntero se refiere a la parte sin caja en la instancia en caja. Entonces, a diferencia del boxeo, el desempaquetado no implica la copia de ningún byte en la memoria. Después de haber hecho esta importante aclaración , es importante tener en cuenta que una operación de unboxing es seguida de la copia de los campos.

Richter, Jeffrey (2010-02-05). CLR a través de C# (Ubicaciones de Kindle 4167-4171). OReilly Media - A. Edición Kindle.

+0

tenía exactamente la misma pregunta al leer el párrafo – zinking

Respuesta

6

Para encasillar una int, necesita crear un objeto en el montón lo suficientemente grande como para contener todos los datos que contiene la estructura. La asignación de un nuevo objeto en el montón significa que el GC buscará un lugar y trabajará para que el GC lo limpie/mueva durante y después de su vida útil. Estas operaciones, aunque no son super caras, tampoco son baratas.

Para desagrupar un tipo de valor, todo lo que hace es desviar el puntero, por así decirlo. Simplemente necesita ver la referencia (que es la que tiene object) para encontrar la ubicación de los valores reales. Buscar un valor en la memoria es muy barato, y esa es la razón por la que ese párrafo dice que "unboxing" es barato.

Actualización:

Mientras que un tipo de valor sin embalaje generalmente se copiará en algún otro lugar justo después de estar sin caja, que no siempre es el caso. Consideremos el siguiente ejemplo:

public struct MyStruct 
{ 
    private int value = 42; 
    public void Foo() 
    { 
    Console.WriteLine(value); 
    } 
} 

static void Main() 
{ 
    object obj = new MyStruct(); 
    ((MyStruct)obj).Foo(); 
} 

El MyStruct se encajona en obj pero cuando es sin embalaje nunca ha copiado en cualquier lugar, un método es simplemente invoca en él. Del mismo modo, podría extraer una propiedad/campo de la estructura y copiar solo esa parte sin copiar todo. Esto puede parecer un poco artificial, pero aún no es del todo absurdo. Dicho esto, como su cita lo indica, es probable que copie la estructura después de que la haya desempaquetado.

+0

Pero después de encontrar los valores, los valores se copiarán nuevamente a Pila, ¿es correcto? – Tarik

+0

@Braveyard No, eso no es. Es bastante común que una vez que el valor se haya desempaquetado, se copie, pero no es necesario. Además, es posible que no se copie en la pila, podría copiarse en un campo de otro tipo de referencia en el montón. – Servy

+0

Agregué una muestra de código a la respuesta. – Servy

Cuestiones relacionadas