• 0
Sign in to follow this  
Denis Bittencourt Muniz

Boxing E Unboxing

Question

Fala pessoal!

Bom, pelo título do tópico e pela descrição do tópico, já fiz minha pergunta. O que é? Qual a diferença? Gostaria de exemplos, grato.

Thanks!

Share this post


Link to post
Share on other sites

6 answers to this question

Recommended Posts

  • 0

Estranho ninguém ter respondido ainda blink.gif

A dúvida ainda está aberta?

Deixa eu tentar explicar(tanto tempo que eu num venho na SB, sabe! smile.gif )

Você sabe que em C# todos os tipos são objetos, certo?

E que todos os objetos derivam da classe System.Object, o que podemos chamar de "sistema de tipo unificado".

É como se, implicitamente, você declarasse cada classe assim:

public class Exemplo : System.Object { blablabla }

certo?

Então, imagine que você precisa guardar dados genéricos, sei lá, num array, que pode conter strings, ints ou sei lá o que.

Você pode fazer o seguinte:

object[] dados = new object[tamanho];
Certo? Então, a ação de transformar dados derivados em objects, ou seja, fazer o upcasting da hierarquia, é o boxing. Se não estou enganado, não interessa a intenção de fazê-lo, mas a ação. E unboxing é fazê-los retornar ao tipo derivado. Exemplo rápido:
int inteiro = 12;
System.Console.WriteLine("inteiro = {0}", inteiro); // imprime inteiro = 12
object o = new object();
o = inteiro; /* cast implícito, ok, a herança implica que uma classe filho É uma classe pai -> BOXING */
System.Console.WriteLine("o = {0}", o); // imprime o = 12
inteiro = (int) o; /* cast explícito, pois nas regras de herança, uma classe filho não é necessariamente uma classe pai, ou seja, o inverso pra condição anterior não é verdadeiro. Em todo caso, mesmo que a conversão seja possível, como nesse caso, deve ser feita explicitamente. -> UNBOXING. */
System.Console.WriteLine("inteiro = {0}", inteiro);

Certinho? smile.gif

Se houver algum erro corrijam-me, também estou iniciando em C# biggrin.gif

Abraços,

Rodrigo

Share this post


Link to post
Share on other sites
  • 0

Entendo, resumindo, quando tem uma conversão para o tipo primitivo (object) estou 'fazendo um boxing', pois, de uma certa forma, 'int' é um objeto (derivado), como ilustra seu exemplo, segundo minha interpretação. Mas no 'unboxing' tenho a necessidade de usar 'cast', pois 'o' é um objeto, porém não *tem um tipo* definido (como se fosse o tipo 'Variant' do VB6) e tenho a necessidade de indicar que aquele valor realmente será inteiro, ou seja, faze-lô seguir um 'padrão' de dados, porém com a primitividade de um objeto... certo?

Se falei bobagens, peço alguém para me corrigir : )

Falows!

Share this post


Link to post
Share on other sites
  • 0
Entendo, resumindo, quando tem uma conversão para o tipo primitivo (object) estou 'fazendo um boxing', pois, de uma certa forma, 'int' é um objeto (derivado), como ilustra seu exemplo, segundo minha interpretação. Mas no 'unboxing' tenho a necessidade de usar 'cast', pois 'o' é um objeto, porém não *tem um tipo* definido (como se fosse o tipo 'Variant' do VB6) e tenho a necessidade de indicar que aquele valor realmente será inteiro, ou seja, faze-lô seguir um 'padrão' de dados, porém com a primitividade de um objeto... certo?

Se falei bobagens, peço alguém para me corrigir : )

Falows!

Na verdade eu acho que você pegou a idéia do boxing, mas misturou um pouco com herança (o que eu acho normal, já que em boxing você usa herança).

Veja bem, vou tentar separar as coisas pra você(a características de herança que eu falei e o boxing).

Casting com Herança

Imagine uma classe base e uma classe derivada.

public class Base
{
    ...
}

public class Derivada : Base
{
    ...
}
Segunda as regras de herança, uma classe derivada é uma classe base, porque possui todos os campos, propriedades e métodos da classe base. Então, um objecto da classe Derivada "é um" objeto de classe Base. O contrário não é verdadeiro, pois um objeto de classe Base não é necessariamente um objeto de classe Derivada. Falando de casting entre as classes, aí vem esse conceito da herança. Você pode fazer um casting como por exemplo:(leve em conta as classes a cima)
Base objbase = new Base();
Derivada objderivada = new Derivada();
objbase = objderivada; // isso é um cast implícito
Entendeu? Ou seja, quando há essa relação do "é um", podemos fazer o cast implícito, porque o compilador de fato sabe que o cast é natural. Mas se quisermos depois disso fazer a "volta" para um objeto de classe derivada, se fizéssemos:
objderivada = objbase;
Isso se não me engano retornaria um erro de compilação. Porque não é possível fazer um cast implícito já que um objeto de classe base "não é um" objeto de classe derivada. Mas você pode "mostrar" que sabe que a conversão não é natural, mas que quer fazer assim mesmo ao compilador, com um cast explícito.
objderivada = (objderivada) objbase; // agora sim OK

Eu acho que é isso. wink.gif

Boxing e Unboxing

É a ação de converter um objeto de classe derivada em objeto de classe base para "empacota-lo" em um tipo comum, em um tipo unificado. É o que ocorre com o tipo object em C#.

E unboxing é justamente o contrário(veja que pegando a explicação sobre a característica do cast entre classe base e derivada que eu botei antes, você pode concluir o porque do cast explícito de um objeto object para um int.)

Ajudei? smile.gif

Rodrigo.

Share this post


Link to post
Share on other sites
  • 0

Ah e pra deixar claro...

Entendo, resumindo, quando tem uma conversão para o tipo primitivo (object) estou 'fazendo um boxing', pois, de uma certa forma, 'int' é um objeto (derivado), como ilustra seu exemplo, segundo minha interpretação.

Sim, todos os tipos derivam da classe object.

Mas no 'unboxing' tenho a necessidade de usar 'cast', pois 'o' é um objeto, porém não *tem um tipo* definido (como se fosse o tipo 'Variant' do VB6) e tenho a necessidade de indicar que aquele valor realmente será inteiro, ou seja, faze-lô seguir um 'padrão' de dados, porém com a primitividade de um objeto... certo?

Não, não é por isso, eu já expliquei em cima smile.gif

E não, eu não creio(não tenho certeza) que System.Object seja um tipo como o Variant do VB6, pelo simples fato de que eu não acredito que o Variant seja uma classe pai dos outros tipos, Integer, String, e outros... E eu acho que isso faz toda a diferença, criando possibilidades legais(que temos com o tipo object) smile.gif

Criar um objeto com

object o = new object();

Não faz de o um objeto sem tipo definido. Pelo menos não na minha opinião.

Droga, eu falo demais! ph34r.gif

Rodrigo.

Share this post


Link to post
Share on other sites
  • 0

E não, eu não creio(não tenho certeza) que System.Object seja um tipo como o Variant do VB6, pelo simples fato de que eu não acredito que o Variant seja uma classe pai dos outros tipos, Integer, String, e outros... E eu acho que isso faz toda a diferença, criando possibilidades legais(que temos com o tipo object)  smile.gif

De fato, o Variant não pode ser comparado ao Object. O primeiro é apenas um tipo suficientemente grande para acomodar qualquer outro tipo, mas não rola a herança (o que acontece com o segundo em relação aos outros tipos).

Droga, eu falo demais!  ph34r.gif

Bem-vindo novamente, Aragorn... ops... rodfraga! smile.gif

Abraços,

Graymalkin

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.
Sign in to follow this