Pregunta

Otro reciente pregunta C # entrevista que tenía era si sabía lo que el boxeo y es Unboxing. Le expliqué que son tipos de valor en la pila y los tipos de referencia en el montón. Cuando un valor se echó a un tipo de referencia, lo llamamos el boxeo y viceversa.

Luego me preguntó para calcular esto:

int i = 20;
object j = i;
j = 50;

¿Cuál es i?

metí la pata y dije 50, donde su realidad 20. Ahora creo entenderlo por qué, sin embargo, cuando estaba jugando con diferentes combinaciones que se sorprendió al ver esto:

Object a = 1; // Boxing
Object b = a; // referencing the pointer on stack to both objects on heap
a = 2; // Boxing

Yo estaba esperando a ver b == 2 así, pero no lo es, ¿por qué? ¿Es porque la segunda boxeo destruye y reemplaza todo el objeto a en el montón?

Porque si hago esto, está bien:

public class TT
{
    public int x;
}

TT t = new TT();
t.x = 1;
TT t2 = new TT();
t2.x = 2;
t = t2;
t.x = 3;

¿Cuál es t2.x? Debería ser 3, y lo es. Pero esto no es un ejemplo de boxeo / unboxing en absoluto, es esto correcto? Entonces, ¿cómo resumiría esto?

¿Podrían los valores vez convertido el mismo en una conversión de boxeo / unboxing que el anterior?

¿Fue útil?

Solución

  1. Tiene razón la segunda asignación sustituye a la primera. No cambia el valor en caja.

  2. Su ejemplo no hace uso del boxeo. El valor (int) se almacena como un int y no en caja.

  3. No, el boxeo todavía mantiene la garantía de la inmutabilidad.

Otros consejos

muy cortos: el boxeo medios crear una nueva instancia de un tipo de referencia . Si usted sabe esto, se entiende que un caso no cambia creando otro.

Lo que está haciendo con a = 2 no está cambiando el valor de la 'caja', que está creando una nueva instancia de un tipo de referencia. Así que ¿por qué nada más que cambie?

  

Yo estaba esperando a ver b == 2, así,   pero no lo es, ¿por qué? ¿Es porque la   segundo boxeo destruye y reemplaza   el conjunto (a) -objeto en el montón?

No, no exactamente. Se deja el objeto tal como es en el montón (como la variable b también hace referencia a ella) y crea un nuevo objeto para el nuevo valor, que hará referencia a la variable a.

Tienes razón en que el segundo ejemplo no utiliza el boxeo. No se puede acceder a un valor que se encajona en cualquier otra manera que unboxing él, así que no hay manera de cambiar un valor en caja.

Ni siquiera una estructura mutable como Point se puede cambiar cuando está encajonado. Para acceder a las propiedades de la estructura que tiene que desempacar, por lo que no se puede cambiar la estructura en caja en su lugar.

Aquí hay otra variante interesante que apoya los comentarios de Stefan:

        int i = 2;
        object a = i; // Boxing
        object b = a; // Referencing same address on heap as 'a', b == a

        b = i; // New boxing on heap with reference new address, b != a

b es todavía 1 porque b es una referencia que todavía señala al objeto en el montón con un valor de 1. a es 2 porque se ha asignado a un nuevo objeto en el montón con un valor de 2.

t2.x es 3 porque t y t2 son dos referencias diferentes para el mismo objeto en el montón.

Creo que la respuesta a su pregunta con unboxing es que: El resultado de una conversión unboxing es una variable temporal (más detalles: enlace ).

Creo que estaba tratando de hacer algo como:

object a = new Point(10,10);
object b = new Point(20,20);
a = b;

((Point) b).X = 30; //after this operation also a.X should be 30

El código anterior no compilará - detalles en el siguiente enlace, y creo que esta es la respuesta a su pregunta:

  

Yo estaba esperando a ver b == 2, así,   pero no lo es, ¿por qué? ¿Es porque la   segundo boxeo destruye y reemplaza   el conjunto (a) -objeto en el montón?

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