2011-06-06 11 views
5

son 2 y 3 ejemplos de boxeo/desempaquetado?¿Estos ejemplos de boxeo/desempaquetado

1) El ejemplo documentación:

int i = 123; 
object iBoxed = i; 
i = (int) iBoxed; 

2: Es el boxeo/unboxing así?

int i = 123; 
object iBoxed = i; 
i = Int32.Parse(iBoxed.ToString()); 

3: Es el boxeo/unboxing así?

int i = 123; 
object iBoxed = i; 
i = Convert.ToInt32(iBoxed); 

que suponer que en todos los ejemplos que sucede técnicamente lo mismo.

  1. un tipo de valor se crea en la pila se crea
  2. Una referencia en la pila, el valor se copia en el montón.
  3. El valor del montón se copia en la referencia. La referencia se borra.

Supongo que 2 y 3 son ejemplos de boxeo/unboxing?

+0

Creo que sí, ya que pones int en un objeto "caja" y luego lo retiraste de ese cuadro. La idea detrás de box y unbox es cambiar un tipo de valor a un tipo de referencia y volver –

Respuesta

7

En los tres ejemplos:

iBoxed es una copia en caja de i.

En el ejemplo 2: No hay unboxing involucrado aquí, como ToString es un método virtual que finalmente se resolverá a int.ToString, que luego será analizado por int.Parse, el retorno de una caja no int en la pila.

En el ejemplo 3: iBoxed conseguirá unboxed en el cuerpo del método Convert.ToInt32 y devuelve como un entero no en caja, en la pila de nuevo.

+0

@dtb: Sí, eso es lo que intenté decir. El desempaquetado no se realiza en las líneas que vemos, sucede en el cuerpo de 'Convert.ToInt32'. –

+0

He reparado el ejemplo 2, que no se compiló de todos modos. – Robert

+0

Edité mi respuesta de acuerdo con su ejemplo fijo. –

1

Es object iBoxed = i que hacen el boxeo.

Ejemplo 2 no trabajará desde int.Parse espera una cadena

+0

He reparado el ejemplo 2. Thx. – Robert

2

El segundo ejemplo es boxeo pero no unboxing. El int.parse no compilará porque espera una cadena y iBoxed es un objeto. Creo que estás mezclando los conceptos de boxeo y conversión. El boxeo se trata realmente de tomar un tipo de valor, es decir, POD, como dicen en C, y tratarlo como unboxing de referencia es la capacidad de extraer ese mismo tipo de valor de su contenedor.

Ex 2. fijo

int i = 123; // Assigment 
object iBoxed = i ; // This is boxing 
i = int.parse(iBoxed.toString()); //This is unboxing but only for the twostring method the assignment is a value type copy. 
+0

He reparado el ejemplo 2. – Robert

0

En todos sus ejemplos, el tipo de valor i está siendo convertido a un objeto. Esta es la definición de boxeo según MSDN. El boxeo también podría hacerse mediante:

object boxed = (object)i; 

El unboxing es la conversión del objeto de nuevo a un tipo de valor.
Ejemplo 1 es unboxing

Ejemplo 2 se producirá un error de compilación porque Parse espera un argumento string pero sería unboxing si lo hizo iBoxed.ToString()

Ejemplo 3 i sospechoso no es unboxing porque el método Convert simplemente devolverá el valor que pase.

Vale la pena ser consciente del éxito en el boxeo y el desempaquetado. Es más caro que la asignación normal.