Anonymous Types (Tipos Anônimos) é um novo tipo inserido no Visual Basic 2008, que permite criar instancias de objetos sem uma classe definida que define seu tipo, esse objeto contém membros (propriedades) que tem seus tipo inferidos pelo compilador. Desta forma podemos afirmar que um Tipo Anônimo é criado quando você cria uma instancia de um objeto que "não existe", definindo membros de seu interesse a esse objeto, assim o compilador, cria de forma transparente ao usuário, uma classe para esse objeto.
Para compreender melhor o que foi explicado acima veja o exemplo:
Exemplo 1: Criando um Anonymous Type no Visual Basic 2008
Dim books = New With {.Title = "Accelerated VB 2008", _
.ISBN = 9781590598740}
Console.WriteLine("Books é do Tipo : " & books.GetType().Name)
Console.WriteLine("Title é do Tipo : " & books.Title.GetType().Name)
Console.WriteLine("ISBN é do Tipo : " & books.ISBN.GetType().Name)
Console.WriteLine(books)
Console.ReadLine()
Veja que no Exemplo acima em momento algum é definido um Tipo para books, que para o compilador será do tipo Anonymous Types, observe também que é necessário inicializar o objeto para que o compilador atribua a ele o tipo Anonymous Types. Não devemos confundir um Tipo Anônimo com Inferência de Tipo (Type Inference), na Inferência de Tipo logo após o Keyword New é especificado um nome de um Objeto. Veja como ficaria o Exemplo acima utilizando a Inferência de Tipo:
Exemplo 2: Exemplo de Inferência de Tipo no Visual Basic 2008
Dim books = New Book With {.Title = "Accelerated VB 2008", _
.ISBN = 9781590598740}
Console.WriteLine("Books é do Tipo : " & books.GetType().Name)
Console.WriteLine("Title é do Tipo : " & books.Title.GetType().Name)
Console.WriteLine("ISBN é do Tipo : " & books.ISBN.GetType().Name)
Console.WriteLine(books)
Console.ReadLine()
obs.: Para o exemplo acima foi criada uma classe Book com membros Title e ISBN.
Para o Visual Basic apesar do Objeto books não ter um tipo definido (uma classe associada), os membros de um tipo anônimo tem seu tipo inferido a partir dos valores que inicializarem esses membros. Como no exemplo acima os membros Title e ISBN da books tem seus tipo inferidos pelo compilador, que no caso acima serão String e Long (Int64 para o CLR). Veja a figura abaixo:

Vejamos abaixo o resultado dos códigos acima para melhor entender o que foi explicado até o momento.
Figura 1: Resultado o Exemplo 1 : Criando um Anonymous Type no Visual Basic 2008
Figura 2: Resultado o Exemplo 1 : Exemplo de Inferência de Tipo no Visual Basic 2008
Tipos Mutáveis e Imutáveis
Quando um tipo anônimo é criado, seus membros (propriedades) pode ser mutável (leitura/gravação) ou imutável (somente leitura). Um membro é mutável quando é possível a qualquer momento alterar seu valor, enquanto que uma propriedade imutável os valores que foram inicializados não podem ser alterados.
No exemplo 1, as propriedades de books são mutáveis pois não foi especificado a nenhuma delas que seriam imutáveis. Para que uma propriedade seja imutável é necessário incluir o keyword Key antes do nome desta, como mostra o exemplo abaixo:
Exemplo 3: Definido um membro Imutável para Anonymous Types
Dim books = New With {.Title = "Accelerated VB 2005", _
Key .ISBN = 9781590598740}
books.Title = "Accelerated VB 2008"
Como a propriedade ISBN foi definida como imutável, então não é possível efetuar alteração no seu valor como ocorreu no exemplo acima com Title. É possível marcar apenas uma propriedade com Key ou todas elas.
Inferindo Propriedades para Anonymous Type
Nos exemplos apresentados até então foram definidas os nomes das propriedades para os objetos criados, mas é possível fazer a inferência de nomes de propriedade a partir de nomes de váriaveis. Veja o exemplo abaixo:
Exemplo 4: Inferindo nomes de Propriedade para Anonymous Types
dim bookTitle as string = "Accelerated VB 2005"
dim bookISBN as long = 9781590598740
Dim books = New With {bookTitle ,bookISBN}
Para o exemplo acima, como não foi definido um nome para as propriedades o compilador infere o nomes a partir dos nomes de váriaveis que inicializou as propriedades. Como mostra a figura abaixo:
Figura 3: Informações das variáveis Locais durante o Debug do Código acima
Se desejar definir um nome para as propriedades diferente dos nomes das variaveis de inicialização, basta seguir o Exemplo 1, passando as variaveis como valores de inicialização.
Até o próximo...
Jenner Maciejewsky Rocha
MVP Visual Basic