0Pricing
C# Academy · Lección

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

  1. Tipos de valor frente a tipos de referencia
  2. Boxing y unboxing
  3. Conversiones implícitas y explícitas
  4. La clase Convert y el análisis
← Volver a C# Academy