Boxing e unboxing

Boxing e unboxing são conceitos fundamentais em C#, especialmente quando se trabalha com tipos de valor (value types) e tipos de referência (reference types). Eles permitem a conversão entre esses dois tipos, mas envolvem custos de desempenho e devem ser usados com atenção.

O que é Boxing?

Boxing é o processo de converter um tipo de valor (como int, double, struct) para o tipo object ou para qualquer interface implementada por esse tipo de valor. Quando ocorre o boxing, o valor é encapsulado em um objeto e armazenado no heap gerenciado.

  • Boxing é uma conversão implícita.
  • Permite tratar tipos de valor como objetos.

Exemplo de Boxing:

int i = 123;        // Tipo de valor
object o = i; // Boxing: i é convertido implicitamente para object

Nesse exemplo, o valor de i é copiado para um novo objeto o no heap. Alterar i depois não afeta o e vice-versa.

O que é Unboxing?

Unboxing é o processo inverso: extrai o valor de um objeto (que foi previamente “boxed”) e o converte de volta para o tipo de valor original.

  • Unboxing é uma conversão explícita.
  • É necessário fazer casting para o tipo de valor desejado.

Exemplo de Unboxing:

object o = 123;     // Boxing
int i = (int)o; // Unboxing: é necessário o cast explícito

Se tentar fazer unboxing para um tipo incompatível, ocorre uma exceção em tempo de execução.

Exemplo Prático Completo

int numero = 42;           // Tipo de valor
object caixa = numero; // Boxing

numero = 100; // Altera apenas 'numero', não 'caixa'

int resultado = (int)caixa; // Unboxing
Console.WriteLine(resultado); // Saída: 42

Note que modificar numero após o boxing não afeta o valor armazenado em caixa.

Cuidados e Performance

  • Boxing e unboxing são operações custosas, pois envolvem alocação de memória e cópia de dados.
  • Evite usar boxing/unboxing em operações críticas de desempenho, como laços intensivos ou manipulação de grandes volumes de dados.
  • Prefira coleções genéricas (List<T>, Dictionary<TKey, TValue>) para evitar boxing desnecessário.

Resumo: Diferenças entre Boxing e Unboxing

BoxingUnboxing
Conversão de valor para referênciaConversão de referência para valor
ImplícitoExplícito (necessita cast)
Aloca objeto no heapExtrai valor do objeto