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
Boxing | Unboxing |
---|---|
Conversão de valor para referência | Conversão de referência para valor |
Implícito | Explícito (necessita cast) |
Aloca objeto no heap | Extrai valor do objeto |