Tipos anônimos (Visual Basic)

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 Object e contém as propriedades que você especificar no declarar o objeto.Porque não foi especificado o nome do tipo de dados, ele é conhecido como um tipo anônimo.

O exemplo a seguir declara e cria variável product como uma instância de um tipo que possui duas propriedades, Name anônimo e Price.

' Variable product is an instance of a simple anonymous type.
Dim product = New With {Key .Name = "paperclips", .Price = 1.29}

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 uma determinada consulta pode selecionar colunas.Tipos anônimos permitem que você escrever uma consulta que seleciona qualquer número de colunas, em qualquer ordem.O compilador cria um tipo de dados que corresponde a ordem especificada e as propriedades especificadas.

Nos exemplos a seguir, products é uma lista de objetos do produto, cada um deles tem várias propriedades.Variável namePriceQuery contém a definição de uma consulta que, quando ele é executado, retorna uma coleção de instâncias de um tipo que possui duas propriedades, Name anônimo e Price.

Dim namePriceQuery = From prod In products
                     Select prod.Name, prod.Price

Variável nameQuantityQuery contém a definição de uma consulta que, quando ele é executado, retorna uma coleção de instâncias de um tipo que possui duas propriedades, Name anônimo e OnHand.

Dim nameQuantityQuery = From prod In products
                        Select prod.Name, prod.OnHand

Para obter mais informações sobre o código criado pelo compilador para um tipo anônimo, consulte Definição de tipo anônimo (Visual Basic).

Observação de cuidadoCuidado

O nome do tipo anônimo é compilador gerado e pode variar de compilação a compilação.Seu código não deve usar ou contar com o nome de um tipo anônimo porque o nome pode mudar quando um projeto é recompilado.

Declarar um tipo anônimo

A declaração de uma instância de um tipo anônimo usa um inicializador lista para especificar as propriedades do tipo.Você pode especificar propriedades somente quando você declarar um tipo anônimo, não outros elementos de classe como métodos ou eventos.No exemplo a seguir, product1 é uma instância de um tipo anônimo que tem duas propriedades: Name e Price.

' Variable product1 is an instance of a simple anonymous type.
Dim product1 = New With {.Name = "paperclips", .Price = 1.29}
' -or-
' product2 is an instance of an anonymous type with key properties.
Dim product2 = New With {Key .Name = "paperclips", Key .Price = 1.29}

Se você designar propriedades como propriedades chave, você poderá usá-los para comparar duas instâncias tipo anônimo de igualdade.No entanto, os valores das propriedades de chave não podem ser alterados.Consulte a seção Propriedades de chave posteriormente neste tópico para obter mais informações.

Observe que declarar uma instância de um tipo anônimo é como declarar uma instância de um tipo nomeado usando um inicializador de objeto:

' Variable product3 is an instance of a class named Product.
Dim product3 = New Product With {.Name = "paperclips", .Price = 1.29}

Para obter mais informações sobre outras maneiras para especificar propriedades de tipo anônimo, consulte Como: inferir tipos em declarações de tipo anônimo (Visual Basic) e nomes de propriedade.

Propriedades de chave

Chave propriedades diferem de não-chave propriedades de várias maneiras fundamentais:

  • Somente os valores das propriedades de chave são comparados para determinar se duas instâncias são iguais.

  • Os valores das propriedades de chave são somente leitura e não podem ser alterados.

  • Somente valores de propriedade de chave estão incluídos no algoritmo Compiler-generated código hash para um tipo anônimo.

Bb384767.collapse_all(pt-br,VS.110).gifIgualdade

Instâncias de tipos anônimos podem ser iguais somente se eles forem instâncias do mesmo tipo anônimo.O compilador trata duas instâncias como instâncias do mesmo tipo se eles atendam às seguintes condições:

  • Eles são declarados no mesmo assembly.

  • As propriedades são declaradas na mesma ordem, com os mesmos nomes e os mesmos inferidos tipos.Nome comparações não diferenciam maiúsculas de minúsculas.

  • As mesmas propriedades em cada são marcadas como propriedades de chave.

  • Pelo menos uma propriedade em cada declaração é uma propriedade de chave.

Uma instância de um anônimo tipos que tem propriedades nenhuma chave é igual somente a si mesmo.

' prod1 and prod2 have no key values.
Dim prod1 = New With {.Name = "paperclips", .Price = 1.29}
Dim prod2 = New With {.Name = "paperclips", .Price = 1.29}

' The following line displays False, because prod1 and prod2 have no
' key properties.
Console.WriteLine(prod1.Equals(prod2))

' The following statement displays True because prod1 is equal to itself.
Console.WriteLine(prod1.Equals(prod1))

Duas instâncias do mesmo tipo anônimo são iguais se os valores de suas propriedades de chave forem iguais.Os exemplos a seguir ilustram como igualdade é testada.

Dim prod3 = New With {Key .Name = "paperclips", Key .Price = 1.29}
Dim prod4 = New With {Key .Name = "paperclips", Key .Price = 1.29}
' The following line displays True, because prod3 and prod4 are
' instances of the same anonymous type, and the values of their
' key properties are equal.
Console.WriteLine(prod3.Equals(prod4))

Dim prod5 = New With {Key .Name = "paperclips", Key .Price = 1.29}
Dim prod6 = New With {Key .Name = "paperclips", Key .Price = 1.29,
                      .OnHand = 423}
' The following line displays False, because prod5 and prod6 do not 
' have the same properties.
Console.WriteLine(prod5.Equals(prod6))

Dim prod7 = New With {Key .Name = "paperclips", Key .Price = 1.29,
                      .OnHand = 24}
Dim prod8 = New With {Key .Name = "paperclips", Key .Price = 1.29,
                      .OnHand = 423}
' The following line displays True, because prod7 and prod8 are
' instances of the same anonymous type, and the values of their
' key properties are equal. The equality check does not compare the
' values of the non-key field.
Console.WriteLine(prod7.Equals(prod8))

Bb384767.collapse_all(pt-br,VS.110).gifValores somente leitura

No entanto, os valores das propriedades de chave não podem ser alterados.Por exemplo, em prod8 No exemplo anterior, o NamePrice campos e read-only,mas OnHand pode ser alterado.

        ' The following statement will not compile, because Name is a key
        ' property and its value cannot be changed.
        ' prod8.Name = "clamps"

        ' OnHand is not a Key property. Its value can be changed.
        prod8.OnHand = 22

Tipos de expressões de consulta anônimos

Expressões de consulta nem sempre não necessário a criação de tipos anônimos.Quando possível, eles usar um tipo existente para manter os dados da coluna.Isso ocorre quando a consulta retorna registros qualquer inteiros do fonte de dados, ou apenas um campo de cada registro.Nos exemplos de código a seguir, customers é uma coleção de objetos de uma classe Customer.A classe tem várias propriedades, e você pode incluir uma ou mais no resultado da consulta, em qualquer ordem.Nos dois primeiros exemplos, não anônimos tipos são necessários porque as consultas selecionar elementos de tipos nomeados:

  • custs1 Contém uma coleção de cadeias de caracteres, pois cust.Name é uma cadeia de caracteres.

    Dim custs1 = From cust In customers
                 Select cust.Name
    
  • custs2 Contém uma coleção de objetos Customer,porque cada elemento do customers é um objeto Customer, e o elemento inteiro é selecionado pela consulta.

    Dim custs2 = From cust In customers
                 Select cust
    

No entanto, tipos nomeados apropriados não estão sempre disponíveis.Convém selecionar nomes de clientes e endereços para uma finalidade, números de identificação do cliente e locais para outro e os nomes dos clientes, endereços e históricos pedido para um terceiro.Anônimos tipos permitem que você selecionar qualquer combinação de propriedades, em qualquer ordem, sem primeiro declarar um novo tipo nomeado para armazenar o resultado.Em vez disso, o compilador cria um tipo anônimo para cada compilação de propriedades.A consulta a seguir seleciona somente o cliente do nome e número de identificação de cada objeto Customer no customers.Portanto, o compilador cria um tipo anônimo que contém somente essas duas propriedades.

Dim custs3 = From cust In customers
             Select cust.Name, cust.ID

Tanto os nomes e os tipos de dados das propriedades no tipo anônimo são tirados dos argumentos para Select,cust.Name e cust.ID.As propriedades em um tipo anônimo que é criado por uma consulta são sempre propriedades chave.Quando custs3 é executado no loop For Each a seguir, o resultado é um conjunto de instâncias de um tipo com duas propriedades chave, Name anônimo e ID.

For Each selectedCust In custs3
    Console.WriteLine(selectedCust.ID & ": " & selectedCust.Name)
Next

Os elementos da coleção representado por custs3 são altamente digitados, e você pode usar o IntelliSense para navegar através das propriedades disponíveis e para verificar seus tipos.

Para mais informações, consulte Introdução ao LINQ em Visual Basic.

Decidir se usar tipos anônimos

Antes de criar um objeto como uma instância de uma classe anônima, considere se que é a melhor opção.Por exemplo, se você deseja criar um objeto temporário para conter dados relacionados, e tiver nenhuma necessidade de outros campos e métodos que pode conter uma classe concluída, um tipo anônimo é uma boa solução.Tipos anônimos são também convenientes se você desejar uma seleção diferente de propriedades para cada declaração, ou se você quiser alterar a ordem das propriedades.No entanto, se seu projeto inclui vários objetos que têm as mesmas propriedades, em uma ordem fixa, você pode declará-las mais facilmente usando um tipo nomeado com um construtor de classe.Por exemplo, com um construtor apropriado, é mais fácil várias instâncias de uma classe Product declarar que ele é para declarar várias instâncias de um tipo anônimo.

' Declaring instances of a named type.
Dim firstProd1 As New Product("paperclips", 1.29)
Dim secondProd1 As New Product("desklamp", 28.99)
Dim thirdProd1 As New Product("stapler", 5.09)

' Declaring instances of an anonymous type.
Dim firstProd2 = New With {Key .Name = "paperclips", Key .Price = 1.29}
Dim secondProd2 = New With {Key .Name = "desklamp", Key .Price = 28.99}
Dim thirdProd2 = New With {Key .Name = "stapler", Key .Price = 5.09}

Outra vantagem dos tipos nomeados é que o compilador pode pegar um acidental Digitação incorreta de propriedade Nome.Nos exemplos a anteriores, firstProd2,secondProd2 e thirdProd2 pretendem ser instâncias do mesmo tipo anônimo.No entanto, se você fosse acidentalmente declarar thirdProd2 em uma das maneiras a seguir, seu tipo deve ser diferente do firstProd2 e secondProd2.

' Dim thirdProd2 = New With {Key .Nmae = "stapler", Key .Price = 5.09}
' Dim thirdProd2 = New With {Key .Name = "stapler", Key .Price = "5.09"}
' Dim thirdProd2 = New With {Key .Name = "stapler", .Price = 5.09}

Além disso, há limitações no uso dos tipos anônimos que não se aplicam às instâncias dos tipos nomeados.firstProd2secondProd2 e thirdProd2 são instâncias do mesmo tipo anônimo.No entanto, o nome para o tipo anônimo compartilhado não está disponível e não pode aparecer em um nome de tipo é esperado no seu código.Por exemplo, um tipo anônimo não pode ser usado para definir uma assinatura método, para declarar outra variável do campo ou em qualquer declaração de tipo.Um resultado, anônimos tipos são não apropriados quando você tem que compartilhar informações entre os métodos.

Definição tipo anônimo

Em resposta para a declaração de uma instância de um tipo anônimo, o compilador cria um novo definição de classe que contém as propriedades para o tipo especificadas.

Se um declaração de tipo anônimo contém pelo menos uma propriedade de chave, o definição de tipo substitui três membros herdados Object:Equals, GetHashCode e ToString.O código produzido para teste de igualdade e determinar que o valor código hash considera apenas as propriedades da chave.Se o tipo anônimo contiver sem propriedades chave, somente ToString é substituído.Propriedades explicitamente nomeadas de um tipo anônimo não é possível entrar em conflito com esses métodos gerados.Ou seja, não é possível usar .Equals, .GetHashCode, ou .ToString para nomear uma propriedade.

Tipo anônimo definições que incluem pelo menos uma propriedade de chave também implementa a interface System.IEquatable<T>, onde T é o tipo do tipo anônimo.

Para obter mais informações sobre o código criado pelo compilador e a funcionalidade dos métodos substituídos, consulte Definição de tipo anônimo (Visual Basic).

Consulte também

Tarefas

Como: inferir tipos em declarações de tipo anônimo (Visual Basic) e nomes de propriedade

Referência

Chave (Visual Basic)

Conceitos

Inicializadores de objeto: Nomeados e anônimos tipos (Visual Basic)

Inferência de tipo de local (Visual Basic)

Introdução ao LINQ em Visual Basic

Definição de tipo anônimo (Visual Basic)