VB .NET - Tipos Anônimos (revisitado)

Os tipos anônimos fornecem uma maneira conveniente para encapsular um conjunto de propriedades somente leitura em um único objeto sem precisar primeiro definir explicitamente um tipo.


O nome do tipo é gerado pelo compilador e não está disponível no nível do código fonte. O tipo das propriedades é inferido pelo compilador.
 

O exemplo a seguir mostra um tipo anônimo sendo inicializado com 3 propriedades chamadas id, preco e nome.

 

Abra o Visual Studio 2013 Express for Windows desktop e crie um novo projeto do tipo Console Application com o nome TiposAnonimos e a seguir digite o código abaixo:

 

Module Module1	
    Sub Main()
        Dim produto = New With {.id = 1, .nome = "Monitor LED 32 polegadas", .preco = 1500}
        Console.WriteLine("id: {0} {1} - preço: {2:n2}", produto.id, produto.nome, produto.preco)
        Console.ReadKey()
    End Sub
End Module

Você vai conseguir compilar e rodar o projeto com sucesso e verá o resultado exibido no console conforme a figura ao lado.

Agora eu pergunto: Onde esta a classe produto ?

O Visual Basic oferece suporte a tipos anônimos, que permitem criar 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 possui um nome utilizável, herda diretamente da classe  Object e contém as propriedades que você especificar ao declarar o objeto.

Como não foi especificado o nome do tipo de dados, ele é conhecido como um tipo anônimo.

Então no exemplo você percebeu que criamos um tipo, definimos 3 propriedades e atribuímos valores a elas e acessamos esses valores exibindo-os no console sem ter que criar a classe e depois a sua instância ?

É justamente isso que são os tipos anônimos.

Como eu crio os tipos anônimos ?

Tipos anônimos são criados usando operador new com um inicializador de objeto.

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 você declara um tipo anônimo, mas não outros elementos de classe como métodos ou eventos.

No exemplo a seguir, produto1 é uma instância de um tipo anônimo que tem duas propriedades: nome e preço.

Dim produto = New With {.id = 1, .nome = "Monitor LED 32 polegadas", .preco = 1500}

A seguir temos outra sintaxe para criar tipos anônimos que usa a palavra Key:

Dim produto2 = New With {Key .id = 2, Key .Nome = "Caneta", Key .Prece = 1.29}

Se você designar propriedades como propriedades Key, você pode usá-las para comparar duas instâncias de tipos anônimos para a igualdade. No entanto, os valores das propriedades de chave não pode ser alterado.

Exemplo:  Comparando duas instâncias de tipos anônimos que usam a chave Key :

Sub Main()
   Dim produto3 = New With {Key .Nome = "Mouse", Key .Preco = 9.29}
   Dim produto4 = New With {Key .Nome = "Mouse", Key .Preco = 9.29}
   Console.WriteLine(produto3.Equals(produto4))

End Sub

Mas onde eu utilizo esse recurso ?

Tipos anônimos são normalmente usados em uma cláusula Select de uma expressão de consulta, geralmente com LINQ, para retornar um subconjunto das propriedades de cada objeto na seqüência de origem.

Uma expressão de consulta usa tipos anônimos para combinar as colunas de dados selecionados por uma consulta. Não é possível definir o tipo de resultado com antecedência, porque você não pode prever as colunas que uma determinada consulta pode selecionar.

Os tipos anônimos permitem que você escreva uma consulta que seleciona qualquer número de colunas, em qualquer ordem. O compilador cria um tipo de dados que corresponde à ordem e às propriedades especificadas.

Nos exemplos a seguir, Produtos é uma lista de objetos do produto, cada um deles tem várias propriedades. A variável consultaPreco contém a definição de uma consulta que, quando é executada, retorna uma coleção de instâncias de um tipo anônimo que possui duas propriedades, Nome e Preco:

Dim consultaPreco  = From prod In produtos
                             Select prod.Nome, prod.Preco

 

O cenário mais comum é inicializar um tipo anônimo com algumas propriedades de outro tipo.

 

No exemplo a seguir, suponha que uma classe chamada Produto que inclui as propriedades Id, Nome e Descricao. No exemplo produtos é uma coleção de objetos Produto.

 

Module Module1
    Sub Main()

        Dim produtos As New List(Of Produto)()
        Dim produto As New Produto()

        produto.Id = 1
        produto.Nome = "Mouse Microsoft"
        produto.Descricao = "Mouse sem fio 1200 dpi"
        produto.Estoque = 10
        produtos.Add(produto)
        produto = New Produto()
        produto.Id = 2
        produto.Nome = "Fone Ouvidos State Lite"
        produto.Descricao = "Fone de ouvidos de luxo"
        produto.Estoque = 5
        produtos.Add(produto)

        Dim consultaProduto = From prod In produtos Select New With {prod.Id, prod.Nome, prod.Descricao}

        For Each p In consultaProduto
            Console.WriteLine("Id={0}, Nome={1}, Descricao={2} ", p.Id, p.Nome, p.Descricao)
        Next
        Console.ReadKey()
    End Sub
End Module

 

Public Class Produto

    Public Property Id() As Integer

     Public Property Nome() As String

     Public Property Descricao() As String

     Public Property Estoque() As Integer

End Class

 

 

Resultado da execução do código cima:

 

 

A declaração de tipo anônimo começa com palavra-chave new e inicializa um novo tipo que usa apenas duas propriedades, Id e Nome, do Produto. Isso faz com que uma quantidade menor de dados sejam retornados na consulta.

Se você não especificar os nomes de membro no tipo anônimo, o compilador dá aos membros do tipo anônimo o mesmo nome que a propriedade que está sendo usada para inicializá-las. Você deve fornecer um nome para a propriedade que está sendo inicializada com uma expressão.

Tipos anônimos são os tipos de referência que derivam diretamente de object. O compilador dá a eles um nome embora sua aplicação não possa acessá-lo. Da perspectiva do common language runtime, um tipo anônimo não é diferente de qualquer outro tipo de referência, exceto que ele não pode ser convertido para qualquer tipo exceto object.

Se dois ou mais tipos anônimos tiverem o mesmo número e tipo de propriedades na mesma ordem, o compilador irá tratá-los como o mesmo tipo e eles compartilham as mesmas informações de tipo gerado pelo compilador.

Um tipo anônimo tem o escopo do método. Para passar um tipo anônimo ou uma coleção que contém os tipos anônimos, fora dos limites de um método, você deve converter primeiramente o tipo para object. No entanto, isso anula a tipagem forte do tipo anônimo.

Se você precisar armazenar os resultados de suas consultas ou passá-las fora dos limites de método, considere o uso de uma classe ou struct em vez de um tipo anônimo.

Propriedades de tipos anônimos não podem conter tipos ponteiro.

Como os métodos Equals e GetHashCode nos tipos anônimos são definidos em termos das propriedades Equals e GetHashcode , duas instâncias do mesmo tipo anônimo serão iguais, apenas se todas as suas propriedades forem iguais.

Lembre-se que um tipo anônimo é imutável pois todas as suas propriedades são somente leitura.

João 6:14 Vendo, pois, aqueles homens o sinal que Jesus operara, diziam: este é verdadeiramente o profeta que havia de vir ao mundo.

João 6:15 Percebendo, pois, Jesus que estavam prestes a vir e levá-lo à força para o fazerem rei, tornou a retirar-se para o monte, ele sozinho.

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