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
- Tipos de valor versus tipos de referência
- Boxing e unboxing
- Conversões implícitas e explícitas
- A classe Convert e análise