2011-03-21 12 views

Respuesta

5

Usted es boxing el entero en un objeto.

Es decir, se crea un objeto que envolturas (o cajas) el número entero. Algo así como poner algo en una caja en la vida real.

+0

El boxeo es un fenómeno físico. ¿Cómo sucede esto realmente (el número entero no pertenece a System.Object)? – SeeSharp

+0

La cita de dtb de la misma documentación lo resume muy bien. – BoltClock

1

int en .NET tiene un objeto tipo Integer subyacente y una conversión implícita.

+5

Creo que estás confundiendo .NET con Java. Y no hay ninguna conversión implícita pasando; sigue siendo un int, disfrazado como un objeto. – BoltClock

+0

Oh sí, lo hice. Eso es lo que recibo por no tomarme el tiempo para pensar antes de publicar. –

+0

@BoltClock En realidad, debido a circunstancias extrañas, pwny tiene razón. El tipo 'int' (y los otros tipos numéricos) en .net es un tipo" mágico ": un valor' int', solo, tiene solo 4 bytes, lo que significa que no puede tener RTTI. Solo cuando intenta usarlo como un objeto (como cuando está encuadrado) se coloca dentro de una instancia 'System.Integer', que es solo un contenedor. Si miras la clase 'System.Integer' a través de Reflector, verás que su único miembro es' int m_value'. Entonces, hay una conversión implícita, lo único es que ocurre en un nivel inferior al esperado. – zneak

7

Boxing and Unboxing:

boxeo es el proceso de convertir un tipo de valor para el objeto de tipo o a cualquier tipo de interfaz implementada por este tipo de valor. Cuando el CLR incluye un tipo de valor, envuelve el valor dentro de un objeto System.Object y lo almacena en el montón administrado. Unboxing extrae el tipo de valor del objeto.

3

Debe leer sobre boxing and unboxing en C# que debe decirle que cómo/por qué.

Este enlace tiene una gran explicación y explica la referencia vs pregunta tipo de valor que están preguntando por:

http://www.dijksterhuis.org/exploring-boxing/

boxeo es como simplemente poniendo un tipo básico en el envoltorio (lo que es un completo soplado objeto), y unboxing tomando ese objeto envuelto y lo convierte de nuevo a un tipo más simple. Para hacer la memoria administrada de boxeo debe asignarse en el montón, las referencias deben actualizarse y los contenidos del tipo de valor deben copiarse.

4

Prueba este método:

object ob; 
int i=10; 
ob=i;//(boxing) 
int b; 
b=(int)ob;//(unboxing) 
15

El término "boxeo" es muy opaca, pero es fácil de visualice lo que realmente está pasando utilizando el depurador. Escribir una pequeña aplicación en modo consola de la siguiente manera:

using System; 

namespace ConsoleApplication1 { 
    class Program { 
     static void Main(string[] args) { 
      int value = 42; 
      object obj = value; 
     } // <== Breakpoint here 
    } 
} 

Establece un punto donde se indica y presione F5. Cuando llegue el punto de interrupción, use Debug + Windows + Memory + Memory 1. En el cuadro Address, escriba "obj". Obtendrá un volcado hexadecimal del contenido de la memoria del objeto. Haga clic con el botón derecho en la ventana y seleccione "Entero de 4 bytes", la mejor manera de visualizar el objeto en este caso. Usted verá algo parecido a esto:

0x01CBF6BC 6e1a2d34 0000002a 

Las partes interesantes aquí son 0x01CBF6BC, esa es la dirección del objeto en el montón de basura recogida. El siguiente número hexadecimal, 6e1a2d34 es el denominado "identificador de tipo", también conocido como el "puntero de tabla de método". Que una 'cookie' que identifica el tipo del objeto. System.Int32 en este caso. Muy importante, se usará más adelante cuando el objeto se vuelva a empaquetar en un Int32 para verificar que el valor encuadrado sea en realidad un número entero.

El siguiente valor que ve, 0000002a, es el valor del objeto encuadrado. Puede usar la calculadora de Windows en modo de programador para convertir de nuevo a decimal, es 42.

Experimente con esto, usando diferentes valores y diferentes tipos para ver cómo afecta el objeto en caja. Puede modificar el hex y ver qué efecto tiene en el valor obj tal como lo muestra el depurador.

El volcado hexadecimal que le di fue para un valor de 4 bytes encuadrado, el boxeo de un doble tomará 8 bytes. Encajonar una estructura tomará más bytes. También hay una parte del encabezado del objeto que no puede ver, el llamado syncblock, ubicado en la dirección - 4. Pruebe la instrucción de bloqueo para ver ese cambio.

+4

+1 Excelente ejercicio; muy interesante. –

Cuestiones relacionadas