Hoje vamos recordar os conceitos de boxing e unboxing na linguagem C#. |
Podemos traduzir boxing como empacotar e unboxing como desempacotar mas creio que o melhor mesmo é nos referirmos aos termos originais boxing e unboxing pois será assim que serão referenciados na literatura e em artigos.
A linguagem C# possui dois tipos de dados :
O tipo de valor armazena o próprio
valor, enquanto o tipo de referência armazena o endereço
do valor em que está armazenado. Alguns tipos de dados
predefinidos, como int, float,
double, decimal, bool, char, etc. são tipos de
valor e object, string e array
são tipos de referência.
Ao trabalhar com esses tipos de dados, você geralmente
precisa converter tipos de valor em tipos de referência
ou vice-versa. Como ambos têm características diferentes
e a plataforma .NET os armazena de maneira diferente na
memória, é necessário trabalhar internamente para
convertê-los de um tipo para outro.
Esses processos de conversão são chamados de boxing e unboxing.
O que é boxing ?
Boxing é o processo de converter um tipo de valor para o tipo de objeto ou qualquer tipo de interface implementado por esse tipo de valor, ou seja, converter um tipo de valor em um tipo de referência. Esta operação é implícita.
No processo da operação boxing temos que:
Exemplo:
int numero = 23 ;
object obj = numero; //Boxing |
Descrição :
Outro exemplo:
ArrayList lista = new ArrayList();
lista.Add(10); //Boxing
lista.Add("Macoratti"); |
Criamos um ArrayList , que é um tipo de referência, chamado lista e incluímos um valor inteiro (10) na lista. Aqui estamos realizando o boxing que inclui o tipo de valor (10) em um tipo de referência (o array lista).
Nota: Como as operações de boxing e unboxing causam uma perda de desempenho prefira usar as coleções genéricas ao invés de usar ArrayList.
O que é Unboxing ?
O Unboxing é o inverso do boxing.
É o processo de converter um tipo de referência em tipo de valor. O unboxing extrai o valor do tipo de referência e o atribui a um tipo de valor. Esta operação é explicita.
Uma operação de conversão unboxing consiste em:
Exemplo:
int i = 123; //tipo de valor
object o = i; // boxing
int j = (int)o; // unboxing |
Aqui estamos copiando o tipo de referência o para o tipo de valor j.
A figura abaixo demonstra as operações :
Para que uma conversão de unboxing em um determinado tipo de valor seja bem-sucedida em tempo de execução, o valor do argumento de origem deve ser uma referência a um objeto que foi criado anteriormente via operação boxing do tipo de valor.
Se o argumento de origem for uma referência a um objeto incompatível, uma InvalidCastException será lançada, e se o valor for null obteremos um NullReferenceException.
Exemplo:
class Program
{
static void Main(string[] args)
{
int i = 123;
object o = i; //boxing
try
{
int j = (short)o; // tentativa de fazer unboxing
System.Console.WriteLine("Operação de Unboxing OK.");
}
catch (System.InvalidCastException e)
{
System.Console.WriteLine($"{e.Message} Error: Operação de unboxing inválida.");
}
}
}
|
Este programa produz o seguinte resultado :
Se você alterar a instrução:
int j = (short) o; para: int j = (int) o;
a conversão será executada e você receberá a saída: Operação de Unboxing OK
E estamos conversados...
"Porque o reino
de Deus não é comida nem bebida, mas justiça, e paz, e alegria no Espírito
Santo."
Romanos 14:17
Referências:
VB .NET - Lendo Arquivos Binários - BinaryReader - Macoratti ...
Tratamento de arquivos - Questões práticas - Macoratti.net
C# - Copiando Arquivos - Macoratti
C# - Localizando linhas em um arquivo texto - Macoratti.net
VB .NET - Armazenando um objeto serializado em um arquivo
C# - Programa para Loja de Instrumentos Musicais - Macoratti ...
C# - Lendo e gravando dados binários no SQL ... - Macoratti
C# - Cadastro com CRUD básico - Macoratti.net
C# - Criando uma interface moderna - Macoratti.net
C# - Os 10 Erros mais comuns dos iniciantes - Macoratti.net
C# - Programa para locadora de carros - Macoratti.net
C# 6.0 - Novos recursos - II - Macoratti.net
C# - Usando os novos recursos da linguagem na prática - II
C# - Testando sua habilidade na resolução de ... - Macoratti.net
C# 7.0 - Novidades - Macoratti.net