Boxing y unboxing
Comprenda el coste de convertir a object.
Boxing y unboxing es una lección gratuita de C# Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C# Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C# Academy incluye 4 lecciones en total.
¿Qué es el boxing?
El boxing envuelve un tipo de valor dentro de un objeto para poder tratarlo como un tipo de referencia. object o = 5; aplica boxing al int y lo coloca en el heap.
using System;
class Program
{
static void Main()
{
int n = 5;
object o = n; // boxing
Console.WriteLine("Boxed value: " + o);
}
}Por qué se produce el boxing
El boxing se produce siempre que se asigna un tipo de valor a una variable de tipo object (o a una interfaz). El runtime asigna en el heap una caja que contiene una copia del valor.
using System;
class Program
{
static void Main()
{
double d = 3.14;
object boxed = d; // boxing copies d into a heap object
Console.WriteLine(boxed);
}
}¿Qué es el unboxing?
El unboxing extrae el tipo de valor de la caja mediante una conversión explícita. El tipo de la conversión debe coincidir exactamente con el tipo aplicado al boxing.
using System;
class Program
{
static void Main()
{
object o = 42; // boxing
int n = (int)o; // unboxing
Console.WriteLine("Unboxed: " + n);
}
}El unboxing requiere el tipo correcto
Debe extraer el valor mediante unboxing usando exactamente el tipo original. Aplicar unboxing a un tipo diferente produce una InvalidCastException.
using System;
class Program
{
static void Main()
{
object o = 100;
try
{
long wrong = (long)o; // InvalidCastException at runtime
Console.WriteLine(wrong);
}
catch (InvalidCastException)
{
Console.WriteLine("Must unbox to int, not long");
}
}
}El boxing crea una copia
El boxing copia el valor. Si después cambia el original, la copia dentro de la caja no cambia.
using System;
class Program
{
static void Main()
{
int n = 1;
object o = n; // box copies 1
n = 99;
Console.WriteLine("original=" + n + ", boxed=" + o);
}
}El coste del boxing
Cada caja asigna memoria en el heap y aumenta la presión sobre el recolector de basura. En bucles intensivos, esta sobrecarga puede perjudicar considerablemente el rendimiento.
using System;
class Program
{
static void Main()
{
// Each iteration boxes an int -> many heap allocations
object sumBox = 0;
for (int i = 0; i < 5; i++)
{
int current = (int)sumBox + i;
sumBox = current; // box again
}
Console.WriteLine("Result: " + sumBox);
}
}Evitar el boxing con genéricos
Las colecciones genéricas como List<int> almacenan tipos de valor sin aplicar boxing, a diferencia de la antigua ArrayList no genérica.
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
var list = new List<int>(); // no boxing
list.Add(1);
list.Add(2);
int first = list[0]; // no unboxing
Console.WriteLine("First: " + first);
}
}Boxing con interfaces
Asignar una struct a una variable de tipo interfaz también aplica boxing, porque la referencia de la interfaz debe apuntar a un objeto del heap.
using System;
class Program
{
static void Main()
{
int n = 7;
IComparable c = n; // boxing to interface
Console.WriteLine(c.CompareTo(10));
}
}Detectar tipos con boxing
Puede comprobar el tipo de un objeto al que se ha aplicado boxing en tiempo de ejecución con is antes de extraerlo mediante unboxing de forma segura.
using System;
class Program
{
static void Main()
{
object o = 3.5;
if (o is double d)
Console.WriteLine("It is a double: " + d);
else
Console.WriteLine("Not a double");
}
}Boxing en la concatenación de cadenas
Concatenar un tipo de valor con cadenas puede provocar boxing. Usar interpolación o ToString suele ser más claro, aunque aquí el boxing normalmente es insignificante.
using System;
class Program
{
static void Main()
{
int count = 3;
string msg = "Count is " + count; // count is converted
Console.WriteLine(msg);
}
}Todo en conjunto
El boxing conecta los mundos de los valores y las referencias, pero tiene el coste de realizar asignaciones. Prefiera los genéricos para evitarlo y haga unboxing usando el tipo exacto después de una comprobación segura.
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
object boxed = 256;
if (boxed is int value)
Console.WriteLine("Safely unboxed: " + value);
var noBox = new List<int> { 1, 2, 3 };
Console.WriteLine("Generic count: " + noBox.Count);
}
}Comprobación rápida
Compruebe su comprensión del boxing y el unboxing.
Resumen
El boxing envuelve un tipo de valor en un objeto del heap (por ejemplo, object o = 5;); el unboxing lo extrae mediante una conversión explícita al tipo original exacto. El boxing copia el valor y asigna memoria, lo que aumenta la presión sobre el GC. Prefiera colecciones genéricas como List<int> para evitar el boxing y use is para realizar unboxing de forma segura.
using System;
class Program
{
static void Main()
{
object boxed = 42; // box
int n = (int)boxed; // unbox
Console.WriteLine(n);
}
}Preguntas frecuentes
¿La lección «Boxing y unboxing» es gratis?
Sí — el texto completo de «Boxing y unboxing» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C# Academy, actualiza a CoddyKit PRO. El curso de C# Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Boxing y unboxing»?
Comprenda el coste de convertir a object. Practicas C# Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar C# Academy?
No se requiere experiencia previa. C# Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «Boxing y unboxing»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de C# Academy?
Sí. Cada lección de C# Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Tipos de valor frente a tipos de referencia
- Boxing y unboxing
- Conversiones implícitas y explícitas
- La clase Convert y el análisis