convert - number c#
Boxeo vs Unboxing (6)
Otra pregunta reciente de la entrevista de C # que tuve fue si sabía qué es el boxeo y el desempaquetado. Expliqué que los tipos de valor están en la pila y los tipos de referencia en el montón. Cuando un valor se convierte en un tipo de referencia, lo llamamos boxeo y viceversa.
Luego me pidió que calculara esto:
int i = 20;
object j = i;
j = 50;
Que es i
Lo arruiné y dije 50, donde en realidad son 20. Ahora creo que entiendo por qué, sin embargo, cuando jugaba con diferentes combinaciones, me sorprendió ver esto:
Object a = 1; // Boxing
Object b = a; // referencing the pointer on stack to both objects on heap
a = 2; // Boxing
Esperaba ver b == 2
también, pero no lo es, ¿por qué? ¿Es porque el segundo boxeo destruye y reemplaza todo a
objeto 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;
¿Qué es t2.x
? Debería ser 3, y lo es. Pero este no es un ejemplo de boxeo / desempaquetado, ¿es correcto? Entonces, ¿cómo resumirías esto?
¿Podrían los valores llegar a ser los mismos en una conversión de boxeo / desempaquetado como anteriormente?
Esperaba ver b == 2 también, pero no lo es, ¿por qué? ¿es porque el segundo boxeo destruye y reemplaza todo el (a) -objeto en el montón?
No, no exactamente. Deja el objeto como está en el montón (ya que la variable b
también hace referencia a él) y crea un nuevo objeto para el nuevo valor, al que la variable a hará referencia.
Tienes razón en que tu segundo ejemplo no usa boxeo. No puede acceder a un valor que se encuentra encuadrado de otra manera que no sea el desempaquetado, por lo que no hay manera de cambiar un valor encuadrado.
Ni siquiera una estructura mutable como el Point
se puede cambiar cuando se encuadra. Para acceder a las propiedades de la estructura, debe desempaquetarla, por lo que no puede cambiar la estructura en caja en su lugar.
Tienes razón la segunda tarea reemplaza a la primera. No cambia el valor en caja.
Tu ejemplo no hace uso del boxeo. El valor (int) se almacena como un int y no encuadrado.
No, el boxeo aún mantiene la garantía de inmutabilidad.
Aquí hay otra variación 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
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: link ).
Creo que estabas 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 se compilará; los detalles en el enlace anterior, y creo que esta es la respuesta a su pregunta:
Esperaba ver b == 2 también, pero no lo es, ¿por qué? ¿es porque el segundo boxeo destruye y reemplaza todo el (a) -objeto en el montón?
Muy breve: el boxeo significa crear una nueva instancia de un tipo de referencia . Si sabe esto, comprende que una instancia no cambia al crear otra.
Lo que está haciendo con a = 2
no es cambiar el valor en el ''cuadro'', está creando una nueva instancia de un tipo de referencia. Entonces, ¿por qué debería cambiar algo más?
b sigue siendo 1 porque b es una referencia que aún apunta al objeto en el montón con un valor de 1. a es 2 porque lo asignó 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 al mismo objeto en el montón.