0Pricing
C# Academy · Aula

Boxing e unboxing

Entenda o custo da conversão para object.

Boxing e unboxing é uma aula grátis de C# Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C# Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C# Academy inclui 4 aulas no total.

O que é o encaixotamento?

O encaixotamento envolve um tipo de valor em um objeto para que ele possa ser tratado como um tipo de referência. object o = 5; encaixota o int na memória dinâmica.

using System;

class Program
{
    static void Main()
    {
        int n = 5;
        object o = n;   // boxing
        Console.WriteLine("Boxed value: " + o);
    }
}

Por que ocorre o encaixotamento

O encaixotamento ocorre sempre que um tipo de valor é atribuído a uma variável do tipo object (ou a uma interface). O ambiente de execução aloca uma caixa na memória dinâmica contendo uma cópia do 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);
    }
}

O que é o desencaixotamento?

O desencaixotamento extrai o tipo de valor da caixa novamente por meio de uma conversão explícita. O tipo da conversão deve corresponder exatamente ao tipo encaixotado.

using System;

class Program
{
    static void Main()
    {
        object o = 42;        // boxing
        int n = (int)o;        // unboxing
        Console.WriteLine("Unboxed: " + n);
    }
}

O desencaixotamento exige o tipo correto

Você deve desencaixotar para o tipo original exato. Desencaixotar para um tipo diferente gera 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");
        }
    }
}

O encaixotamento faz uma cópia

O encaixotamento copia o valor. Alterar o original depois disso não altera a cópia encaixotada.

using System;

class Program
{
    static void Main()
    {
        int n = 1;
        object o = n;   // box copies 1
        n = 99;
        Console.WriteLine("original=" + n + ", boxed=" + o);
    }
}

O custo do encaixotamento

Cada caixa aloca memória na memória dinâmica e aumenta a pressão sobre a coleta de lixo. Em laços intensivos, essa sobrecarga pode prejudicar significativamente o desempenho.

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);
    }
}

Evitando o encaixotamento com genéricos

Coleções genéricas como List<int> armazenam tipos de valor sem encaixotamento, ao contrário da antiga ArrayList não 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);
    }
}

Encaixotamento com interfaces

Atribuir uma estrutura a uma variável de interface também a encaixota, porque a referência da interface precisa apontar para um objeto na memória dinâmica.

using System;

class Program
{
    static void Main()
    {
        int n = 7;
        IComparable c = n;   // boxing to interface
        Console.WriteLine(c.CompareTo(10));
    }
}

Detectando tipos encaixotados

Você pode verificar o tipo de um objeto encaixotado durante a execução com is antes de desencaixotá-lo com segurança.

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");
    }
}

Encaixotamento na concatenação de cadeias

Concatenar um tipo de valor com cadeias de caracteres pode encaixotá-lo. Usar interpolação ou ToString costuma ser mais claro, embora o encaixotamento nesse caso geralmente seja insignificante.

using System;

class Program
{
    static void Main()
    {
        int count = 3;
        string msg = "Count is " + count;   // count is converted
        Console.WriteLine(msg);
    }
}

Colocando tudo em conjunto

O encaixotamento conecta os mundos dos valores e das referências, mas tem o custo de alocações. Prefira genéricos para evitá-lo e desencaixote para o tipo exato usando uma verificação 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);
    }
}

Verificação rápida

Teste sua compreensão sobre encaixotamento e desencaixotamento.

Recapitulação

O encaixotamento envolve um tipo de valor em um objeto na memória dinâmica (por exemplo, object o = 5;); o desencaixotamento o extrai por meio de uma conversão explícita para o tipo original exato. O encaixotamento copia o valor e aloca memória, aumentando a pressão sobre a coleta de lixo. Prefira coleções genéricas como List<int> para evitar o encaixotamento e use is para fazer o desencaixotamento com segurança.

using System;

class Program
{
    static void Main()
    {
        object boxed = 42;     // box
        int n = (int)boxed;     // unbox
        Console.WriteLine(n);
    }
}

Perguntas Frequentes

A aula “Boxing e unboxing” é grátis?

Sim — o texto completo de “Boxing e unboxing” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C# Academy, atualize para CoddyKit PRO. O curso de C# Academy inclui 4 aulas no total.

O que vou aprender em “Boxing e unboxing”?

Entenda o custo da conversão para object. Você pratica C# Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar C# Academy?

Nenhuma experiência prévia é necessária. C# Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.

Quanto tempo leva a aula “Boxing e unboxing”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de C# Academy?

Sim. Cada aula de C# Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Tipos de valor versus tipos de referência
  2. Boxing e unboxing
  3. Conversões implícitas e explícitas
  4. A classe Convert e análise
← Voltar para C# Academy