Boxing e unboxing

Olá pessoas,

seguindo o assunto de tipos de dados nesse post falarei sobre boxing e unboxing! Se essas palavras são estranhas para você, nesse post você vai descobrir o que são! 😀

Como falado no meu último post, o C# possui tipos de dados por valor e por referência, onde o por valor salva o dado em seu espaço de memória, possui diretamente seu valor enquanto o por referência salva uma referência ao endereço de memória do seu dado, seu conteúdo. Lembrando que tipos por valor são alocados na memória stack e tipos por referência na memória heap, sendo referenciados na stack.

Hoje, vamos tratar sobre a conversão entre esses tipos: boxing e unboxing. Segundo a especificação da linguagem C#, sobre boxing e unboxing:

It provides a bridge between value-types and reference-types by permitting any value of a value-type to be converted to and from type object

Em uma tradução livre:

Fornece uma ponte entre os tipos por valor e referência permitindo que qualquer tipo por valor seja convertido para e de um tipo por referência.

Boxing é a conversão de um tipo por valor para um tipo por referência. O que acontece nessa conversão é que o dado é atribuído a um novo objeto do tipo System.Object e armazenado na memória heap. Essa conversão pode ser feita de forma implícita (como ilustrado na imagem a seguir) ou explícita, adicionando-se (Object) a frente do valor atribuído a variável do tipo Object.

A imagem a seguir ilustra o processo de boxing com a variável idade de forma implícita.

stackHeap

 

O unboxing é a conversão entre um tipo por referência para um tipo por valor. Essa conversão possui duas etapas: primeiro é verificado se o valor existente na heap é o mesmo ao qual se está fazendo a conversão, em caso positivo o valor é copiado para a variável do tipo por valor, em caso negativo a exceção InvalidCastException é lançada. Caso a referência para a heap esteja nula a exceção NullReferenceException é lançada.

A imagem a seguir ilustra a conversão unboxing, destacando a coincidência entre o valor salvo na instância salva na memória heap e o tipo da conversão feita para a variável idadeValor.

unboxing

A seguir uma ilustração de uma possível Exception ao tentar acessar o valor de idadeObj quando ainda não tenha sido atribuído seu valor.

nullReferenceExcp

Mas onde essas conversões geralmente acontecem? Não lembro de utilizar isso..

Bom, elas acontecem geralmente na passagem de parâmetros para funções, onde o parâmetro é do tipo Object e o parâmetro passado é um tipo por valor, nessa passagem acontece o boxing.

Dúvidas e sugestões deixem nos comentários,

O próximo post será sobre passagem de parâmetros! Você conhece todas as formas? Sabe como utilizá-las? ^^


Nesse sábado teremos o nosso primeiro Meetup juntamente com o SQL Server RS!

Os assuntos tratados serão “Teste de Software” com Lenerson Velho Nunes e
“Descubra o Poder da Análise de dados com Power BI” com Arthur Luz.

Sobre os palestrantes:

Lenerson Velho Nunes atua como Consultor, Arquiteto de Software e Desenvolvedor de aplicações .NET. Cursou Bacharelado em Ciência da Computação pela UCS e, dos 12 anos que trabalha profissionalmente com desenvolvimento de software, 10 anos são no desenvolvimento de aplicações com a plataforma .NET.
Arthur Luz MCSA & MCT em SQL Server, Especialista em Microsoft Datazen / Mobile Report (SSRS 2016), Analista Sênior em Modelagem e implementação de projetos de Business Intelligence e Palestrante da comunidade Microsoft vinculado ao PASS. Atua hoje como Analista de BI Sênior na empresa Datainfo Soluções em TI no projeto de reestruturação do sistema de BI da ANEEL, Como Instrutor oficial Microsoft [MCT] na empresa Hepta Novintec e como Instrutor e Consultor de BI e Banco de Dados nas empresas One Way Solution e BI do Brasil em exercício de diversos projetos.

Você já confirmou presença?

Segue os links dos meetups!

https://www.meetup.com/pt-BR/NET-Caxias-do-Sul/events/241259407/

https://www.meetup.com/pt-BR/SQL-Server-RS/events/241259453/

Até mais,

Aline. 🙂

 

Referências:

https://msdn.microsoft.com/pt-br/library/4d43ts61(v=vs.90).aspx

https://msdn.microsoft.com/pt-br/library/yz2be5wk(v=vs.90).aspx

http://devbrasil.net/profiles/blogs/o-que-boxing-and-unboxing

Deixe um comentário