Denis Bittencourt Muniz Postado Dezembro 27, 2005 Denunciar Share Postado Dezembro 27, 2005 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! Link para o comentário Compartilhar em outros sites More sharing options...
0 rodfraga Postado Dezembro 31, 2005 Denunciar Share Postado Dezembro 31, 2005 Estranho ninguém ter respondido ainda A dúvida ainda está aberta?Deixa eu tentar explicar(tanto tempo que eu num venho na SB, sabe! )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? Se houver algum erro corrijam-me, também estou iniciando em C# Abraços,Rodrigo Link para o comentário Compartilhar em outros sites More sharing options...
0 Denis Bittencourt Muniz Postado Dezembro 31, 2005 Autor Denunciar Share Postado Dezembro 31, 2005 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! Link para o comentário Compartilhar em outros sites More sharing options...
0 rodfraga Postado Dezembro 31, 2005 Denunciar Share Postado Dezembro 31, 2005 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çaImagine 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 OKEu acho que é isso. 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? Rodrigo. Link para o comentário Compartilhar em outros sites More sharing options...
0 rodfraga Postado Dezembro 31, 2005 Denunciar Share Postado Dezembro 31, 2005 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 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) Criar um objeto comobject 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! Rodrigo. Link para o comentário Compartilhar em outros sites More sharing options...
0 Graymalkin Postado Janeiro 1, 2006 Denunciar Share Postado Janeiro 1, 2006 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) 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! Bem-vindo novamente, Aragorn... ops... rodfraga! Abraços,Graymalkin Link para o comentário Compartilhar em outros sites More sharing options...
0 rodfraga Postado Janeiro 1, 2006 Denunciar Share Postado Janeiro 1, 2006 Obrigado Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Denis Bittencourt Muniz
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!
Link para o comentário
Compartilhar em outros sites
6 respostass a esta questão
Posts Recomendados