Boxing y Unboxing - Tensho97/Aprende-a-Aprender GitHub Wiki
Para explicar estos dos conceptos es necesario empezar por los tipos por valor y los tipos por referencia.
Tipos por valor
También llamados 'tipos primitivos' o 'tipos integrados', son tipos sencillos que almacenan un dato concreto y se almacenan en la pila o stack, una zona de memoria reservada para almacenar la información que tendrá un uso inmediato en el hilo de ejecución del programa. Por ejemplo: los int o los boolean. Todos los tipos primitivos tienen como clase padre ValueType.
Tipos por referencia
Son todo tipo de objetos, empezando por el tipo Object. Se almacenan en una estructura especial que se conoce como heap: una zona de memoria que se reserva para poder asignarla de forma dinámica, es decir, se pueden guardar y eliminar datos en cualquier momento, lo cual también hace más complicada la gestión de la memoria.
Diferencia entre tipos por valor y tipos por referencia
En el caso de los tipos por valor, se copian cuando se asignan a una función. Cuando se le pasa un tipo primitivo a una función, aunque se cambie dentro de ésta, el cambio no se verá reflejado fuera de la misma.
Sin embargo, en los tipos por referencia, sí se pueden modificar los datos originales, ya que lo que se le pasa a la función es una copia de la referencia a ese dato, no una copia del dato.
El comportamiento en la pila es igual en ambos casos, pero en los tipos por valor se guarda el propio dato, y en los tipos por referencia se guarda la referencia al dato.
Boxing y Unboxing
- Boxing: consiste en convertir un tipo por valor en un tipo por referencia, es decir, un primitivo en un objeto. Todos los valores pasados al objeto estarán en el heap, y el valor como tal será almacenado en el objeto creado a partir de la operación 'boxing'.
Un ejemplo de Boxing:
Creamos una variable entera (int):
int i = 123;
Luego copiamos el valor de esa variable en un objeto tipo object:
object o = i; // boxing implicito
O también esta versión:
object o = (object)i; // se usa un casting para ejecutar boxing explicito
Aquí se crea una referencia (o
), que estará en el stack o pila. Esta referencia apuntará al valor de tipo entero, que estará en el_ heap_.
- Unboxing: convertir un objeto en un tipo por valor.
int i = 123;
object o = i; // boxing implícito
int j = (int)o; // unboxing
Autora: Vanesa