Partilhar via


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.

Código compilador-geradas

Para a seguinte definição de product, o compilador cria um novo definição de classe que contém as propriedades Name,Price e OnHand.

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

O definição de classe contém definições de propriedade semelhantes à seguinte.Observe que há um método Set para as propriedades da chave.Os valores das propriedades de chave são somente leitura.

Public Class $Anonymous1
    Private _name As String
    Private _price As Double
    Private _onHand As Integer
     Public Property Name() As String
        Get
            Return _name
        End Get
    End Property

    Public Property Price() As Double
        Get
            Return _price
        End Get
    End Property

    Public Property OnHand() As Integer
        Get
            Return _onHand
        End Get
        Set(ByVal Value As Integer)
            _onHand = Value
        End Set
    End Property

End Class

Além disso, definições de tipo anônimo contêm um construtor padrão.Os construtores que exigem parâmetros não são permitidos.

Se uma declaração de tipo anônimo contém pelo menos uma propriedade de chave, a definição de tipo substitui três membros herdados de Object: Equals, GetHashCode, e ToString. Se nenhuma propriedade de chave é declaradas, somente ToString é substituído.As substituições fornecem a seguinte funcionalidade:

  • Equals Retorna True duas instâncias tipo anônimo se a mesma instância, ou se eles atendam às seguintes condições:

    • Eles devem ter o mesmo número de propriedades.

    • 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.

    • Pelo menos uma das propriedades é uma propriedade de chave, e a Key palavra-chave é aplicada às propriedades do mesmas.

    • Comparação entre cada par correspondente de propriedades chave retorna True.

    Por exemplo, nos exemplos a seguir, Equals retorna True apenas para employee01 e employee08.O comentário antes de cada linha especifica o motivo por que a nova instância não coincide com employee01.

    Dim employee01 = New With {Key .Name = "Bob", Key .Category = 3, .InOffice = False}
    
    ' employee02 has no InOffice property.
    Dim employee02 = New With {Key .Name = "Bob", Key .Category = 3}
    
    ' The first property has a different name.
    Dim employee03 = New With {Key .FirstName = "Bob", Key .Category = 3, .InOffice = False}
    
    ' Property Category has a different value.
    Dim employee04 = New With {Key .Name = "Bob", Key .Category = 2, .InOffice = False}
    
    ' Property Category has a different type.
    Dim employee05 = New With {Key .Name = "Bob", Key .Category = 3.2, .InOffice = False}
    
    ' The properties are declared in a different order.
    Dim employee06 = New With {Key .Category = 3, Key .Name = "Bob", .InOffice = False}
    
    ' Property Category is not a key property.
    Dim employee07 = New With {Key .Name = "Bob", .Category = 3, .InOffice = False}
    
    ' employee01 and employee 08 meet all conditions for equality. Note 
    ' that the values of the non-key field need not be the same.
    Dim employee08 = New With {Key .Name = "Bob", Key .Category = 2 + 1, .InOffice = True}
    
    ' Equals returns True only for employee01 and employee08.
    Console.WriteLine(employee01.Equals(employee08))
    
  • GetHashcode Fornece um algoritmo GetHashCode adequadamente exclusivo.O algoritmo usa somente as propriedades da chave para calcular a código hash.

  • ToString Retorna uma sequência de valores de propriedade concatenados, como mostrado no exemplo a seguir.Tanto chave e as propriedades não chave são incluídas.

    Console.WriteLine(employee01.ToString())
    Console.WriteLine(employee01)
    ' The preceding statements both display the following:
    ' { Name = Bob, Category = 3, InOffice = False }
    

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.

Observação:

Declarações de tipo anônimo criar o mesmo anônimo   type somente se ocorrerem na mesma Assembly , suas propriedades têm os mesmos nomes e os mesmos inferir tipos, as propriedades são declaradas na mesma ordem e sistema autônomo mesmas propriedades marcadas sistema autônomo key propriedades .

Consulte também

Tarefas

Como: Declare uma instância de um tipo anônimo

Como: Inferir tipos na declaração de tipo anônimo e nomes de propriedade

Conceitos

Tipos anônimos

Comparação de tipos nomeados e anônimos