VB .NET - Tipos Anônimos (revisão)

 O artigo de hoje é uma revisão sobre tipos anônimos, um recurso muito importante da linguagem VB .NET

 

Como um bom programador que segue o paradigma da POO, você sabe dos benefícios da definição de classes para representar o estado e funcionalidade de uma determinada entidade de programação.

Criar uma classe é o melhor caminho sempre que você precisar reutilizar código em projetos e proporcionar inúmeras funcionalidades através de um conjunto de métodos, eventos, propriedades e construtores personalizados.

No entanto as vezes você gostaria de definir uma classe apenas para modelar um conjunto de dados encapsulados sem quaisquer métodos, eventos ou outra funcionalidade, onde a classe seria usada apenas internamente para o seu programa sem precisar ser reutilizada.

 

Então se você precisasse de uma classe 'temporária', nas versões anteriores a versão 3.5 da plataforma .NET você teria que criar uma definição de classe via código.

 

Mas a partir do Visual Studio 2008 a linguagem Visual Basic suporta os tipos anônimos, que permitem que você crie objetos sem escrever uma definição de classe para o tipo de dados.

Em vez disso, o compilador gera uma classe para você. A classe não tem um nome utilizável, herda diretamente do objeto, e contém as propriedades especificadas na declaração do objeto.

 

Como o nome do tipo de dados não é especificado, isto chamado de um tipo anônimo.

 

No exemplo a seguir declaramos e criamos uma variável produto como uma instância de um tipo anônimo que possui duas propriedades : Nome e Preco:

   

    A declaração de uma instância de um tipo anônimo usa uma lista de inicializador para especificar as propriedades do tipo.

    Você pode especificar apenas propriedades quando declarar um tipo anônimo, nenhum outro membro de uma classe como métodos ou eventos podem ser declarados.

Estamos exibindo qual o tipo da instância atual de produto usando o método GetType e acessando os valores de suas propriedades.

O resultado indica que o objeto possui um nome interno e é constituído de uma String e um Double.

Eu não tive que definir uma classe Produto mas mesmo assim a variável produto precisou ser fortemente tipada. O compilador gera em tempo de execução uma classe com um nome que não é visível mas que usa a tipagem implícita usando inferência de tipo.

Observe que tivemos que especificar o conjunto de propriedades que modela os dados que estamos tentando encapsular. Uma vez definidos, esses valores podem ser obtidos usando a sintaxe padrão das propriedades na linguagem VB .NET.

Todos os tipos anônimos são automaticamente derivados de System.Object e por isso suportam cada um dos membros fornecidos pela essa classe base.

Se você designar propriedades usando a propriedade Key, você pode comparar duas instâncias de tipos anônimos pela igualdade (Equals). No entanto, os valores das propriedades usando a chave key não poderão ser alterados.

' produto2 é uma instância de um tipo anônimo usando a propriedade key
Dim produto2 = New With {Key .Nome = "Grampeador", Key .Preco = 9.5}

Vamos definir o código abaixo para obter informações do tipo produto criado usando tipos anônimos:

Sub ReflectionSobreAnonymousType(ByVal produto As Object)
        Console.WriteLine("produto é uma instância de : {0}", obj.GetType().Name)
        Console.WriteLine("A classe Base de {0} é {1}", obj.GetType().Name, obj.GetType().BaseType)
        Console.WriteLine("produto.ToString() = {0}", obj.ToString())
        Console.WriteLine("produto.GetHashCode() = {0}", obj.GetHashCode())
        Console.WriteLine()
    End Sub

E vamos alterar o código incluindo uma alteração no valor da propriedade Preco:

produto.Preco = 6.29

Agora executando o código iremos obter:

Observe que o objeto produto é do tipo VB$AnonymousType_0'2 e que este nome é atribuído pelo compilador e não é diretamente acessível via código.

Note que cada par nome/valor definido usando a sintaxe de inicialização de objeto é mapeado para um propriedade do mesmo nome, e que como o tipo anônimo permite os recursos de read/write para as propriedades definidas podemos alterar o estado do objeto após a sua criação usando a sintaxe padrão das propriedades . (Foi o que fizemos alterando o preço : produto.Preco = 6.29)

Se neste  momento você estiver pensando que agora pode usar os tipos anônimos para criar as suas classes ao invés de ter que declará-las previamente via código é melhor eu lhe avisar que isso não será uma boa ideia pelas seguintes limitações que os tipos anônimos possuem:

  1. Você não possui controle sobre o nome do tipo anônimo;
  2. Os tipos anônimos sempre estendem (herdam) de System.Object;
  3. Os tipos anônimos não suportam eventos, métodos customizados , operadores customizados  ou sobrecargas customizadas;
  4. Os tipos anônimos são sempre implicitamente NotInheritable , ou seja, não podem ser herdados por outras classes;
  5. Os tipos anônimos são sempre criados usando o construtor padrão;
  6. Os tipos anônimos não podem ser usados como parâmetros nem usados como tipos de retorno;
  7. O escopo de um tipo anônimo será específico ao membro implementado;

Então para que servem os tipos anônimos ?

Bem, além de poderem ser usados para os cenários específicos que já mencionei na introdução do artigo, o verdadeiro poder dos tipos anônimos aparece quando fazemos uso das consultas expressão e da LINQ - Language Integrade Query.

Lembrando que uma consulta é um conjunto de instruções que descreve quais dados retornar de uma fonte de dados e qual formato e organização os dados retornados terão; e que uma consulta de expressão é uma consulta expressa na sintaxe de consulta.

Uma query expression ou consulta de expressão usa os tipos anônimos para combinar colunas de dados selecionados por uma consulta. Eles permitem que você escreva uma consulta que seleciona qualquer número de colunas em qualquer ordem e o compilador cria um tipo de dados que se ajusta com a propriedade especificada.

Como exemplo de consulta de expressão temos a seguir uma consulta em uma lista de objetos produtos representados por Produtos. Quando a consulta for executada será retornada uma coleção de instâncias de um tipo anônimo que possui duas propriedades : Nome e Preco.

Dim consultaProdutos = From prod In Produtos Select prod.Nome, prod.Preco
Dessa forma os tipos anônimos são muito usados com o LINQ e consultas expressão, mas isso é um assunto para outro artigo.

João 6:35 Declarou-lhes Jesus. Eu sou o pão da vida; aquele que vem a mim, de modo algum terá fome, e quem crê em mim jamais tará sede.

João 6:36 Mas como já vos disse, vós me tendes visto, e contudo não credes.

João 6:37 Todo o que o Pai me dá virá a mim; e o que vem a mim de maneira nenhuma o lançarei fora.

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

 

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter
 

Referências:


José Carlos Macoratti