Ahora que conocemos las definiciones de estos dos conceptos, deberíamos averiguar qué es lo que realmente ocurre cuando se marca o se quita la marca de una variable en C#.
En primer lugar, cuando encajonas una variable, estás envolviendo el valor en una instancia de objeto. Al encajonar, estás realizando una conversión implícita de un tipo primitivo a un tipo de objeto. Esto significa que cuando se ejecuta este código, el compilador ejecutará una conversión de tipo automática. En pocas palabras, el compilador «promoverá» el tipo de valor a su tipo de referencia para evitar posibles pérdidas de datos. Un ejemplo de esto sería un int que el compilador convierte en un objeto System.Int32. Además, cuando esta variable se convierta en un objeto, se almacenará en el montón en lugar de en la pila con los otros tipos primitivos porque, al ser un objeto, necesitará una asignación de memoria dinámica.
Cuando desbloqueas una variable, estás desenvolviendo un tipo de objeto a un tipo primitivo. Al desempacar, estás realizando una conversión explícita de un tipo de objeto a un tipo primitivo. Esto significa que básicamente está dando al compilador una instrucción específica para realizar esta conversión porque necesita decirle al compilador que desea implicar una interpretación de esta variable diferente a la que el compilador esperaría normalmente.
Es importante señalar que mientras se encajona una variable, si se cambia el valor de la variable primitiva original después de encajonarla en un objeto, el valor recién asignado no persistirá en el nuevo objeto. Un ejemplo de esto está en el siguiente bloque de código.
12345int sampleNumber = 5; //afirmación de asignaciónObjeto ob = sampleNumber; //boxingsampleNumber = 10;Console.WriteLine("Valor de sampleNumber: " + sampleNumber);Console.WriteLine("Valor de ob: " + ob);[c#]
Si se observa el resultado, se puede ver que el valor de ob cambiará en la declaración de asignación, pero luego no cambiará cuando se actualice el número de muestra.