2010-09-18 22 views
10

Estaba leyendo Microsoft Class Class Training Materil. Leí el siguienteUnboxing no crea una copia del valor. ¿Es esto correcto?

Unboxing Unboxing es lo opuesto al boxeo. Es la conversión explícita de un tipo de referencia a un tipo de valor . Unboxing recupera una referencia al tipo de valor contenido en un objeto. Una operación de unboxing implica verificar la instancia del objeto para asegurar que la instancia del objeto es un valor encasillado del tipo de valor dado. Entonces, el valor de la instancia es copiado en la variable de tipo de valor.

**

Unboxing devuelve un puntero a los datos dentro de un objeto en caja y no crea una copia de los datos.

**

Realmente no entiendo la línea del que hablábamos. dice que al desempaquetar un objeto en caja, no crea una copia, simplemente devuelve un puntero. Si eso es cierto, se asignará una variable de tipo de valor en Hep right?

Ram

Respuesta

9

Bueno, es verdad, pero no toda la imagen.

El desempaquetado solo devuelve un puntero a los datos, pero no puede usar eso para acceder a los datos en C#. Cuando haya desagrupado un valor en C#, siempre lo copiará en alguna parte.

Ejemplo:

object o = 42; //box 
int i = (int)o; //unbox 

El unboxing vacación por sí misma se pone el puntero al valor 42 en el objeto o, entonces el valor se copia en la variable i.

+0

Eso tiene sentido. Gracias – RAM

+0

¿Hay algún lugar en el que el puntero al valor sin clasificar se pueda usar directamente sin copiar el valor? – RAM

+1

@RAM: No lo creo, al menos no es fácil. Quizás pueda usar 'fixed' para fijar el objeto en la memoria y obtener un puntero al valor, pero eso sería mucho más complicado que simplemente copiar el valor. Los valores que aparecen en el recuadro son pequeños, por lo que no hay una razón real para intentar evitar copiarlos. – Guffa

14

Además de lo que dijo Guffa, he aquí algo de información adicional:

  • La operación “unboxing” descrito por el texto que citan describe la instrucción unbox CIL. El estándar CIL tiene esto que decir acerca unbox:

    A diferencia box, que se requiere para hacer una copia de un tipo de valor para su uso en el objeto , unbox es no requerido para copiar el valor escriba desde el objeto. Típicamente simplemente calcula la dirección de del tipo valor que es ya presente en el interior de la caja objeto

  • Las conversiones unboxing que utiliza en C# son no compilado para unbox. Se compilan a otra instrucción llamada unbox.any:

    [...] la instrucción unbox.any extrae el valor contenido en obj (del tipo O). (Es equivalente a unbox seguido por ldobj.)

    En Inglés, esto significa unbox.any hace una operación unboxing (unbox) - que empuja un punteroen la pila de evaluación - seguido por la operación de copia (ldobj) , que convierte el puntero al valor real contenido en el tipo de valor y lo envía a la pila de evaluación.

    Para completar, aquí está la descripción de ldobj:

    Los ldobj instrucción copia un valor a la pila de evaluación. [...] src es un puntero no administrado (int nativo) o un puntero administrado (&). [...]

    [Justificación: La instrucción ldobj puede ser utilizado para pasar un tipo de valor como argumento. finales razón]

Por lo que yo sé, el compilador de C# nunca usa unbox o ldobj, siempre utiliza unbox.any hacer unboxing y ldind.* para deshacer referencias (como ref/out parámetros).

+1

explicación muy clara. De las respuestas dadas por usted y Guffa, entiendo claramente Unboxing. Gracias por tu gran explicación y tiempo - Ram – RAM

Cuestiones relacionadas