Definição do tipo anônimo (Visual Basic)
Em resposta à declaração de uma instância de um tipo anônimo, o compilador cria uma nova definição de classe que contém as propriedades especificadas para o tipo.
Código gerado pelo compilador
Para a definição a seguir de product
, o compilador cria uma nova definição de classe que contém 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}
A definição de classe contém definições de propriedade semelhantes às seguintes. Observe que não há nenhum método Set
para as propriedades de 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 ReadOnly Property Name() As String
Get
Return _name
End Get
End Property
Public ReadOnly 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, as definições de tipo anônimo contêm um construtor sem parâmetros. Construtores que exigem parâmetros não são permitidos.
Se a declaração de tipo anônimo tiver pelo menos uma propriedade chave, a definição de tipo substituirá três membros herdados de Object: Equals, GetHashCode e ToString. Se nenhuma propriedade de chave for declarada, somente ToString será substituída. As substituições fornecem a seguinte funcionalidade:
Equals
retornaráTrue
se duas instâncias de tipo anônimo forem a mesma instância ou se atenderem às seguintes condições:Eles têm o mesmo número de propriedades.
As propriedades são declaradas na mesma ordem, com os mesmos nomes e os mesmos tipos inferidos. As comparações de nomes não diferenciam maiúsculas de minúsculas.
Pelo menos uma das propriedades é uma propriedade chave e a palavra-chave
Key
é aplicada às mesmas propriedades.A comparação de cada par correspondente de propriedades de chave retorna
True
.Por exemplo, nos exemplos a seguir,
Equals
retornaTrue
somente paraemployee01
eemployee08
. O comentário antes de cada linha especifica o motivo pelo qual a nova instância não correspondeemployee01
.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 apropriadamente exclusivo. O algoritmo usa apenas as propriedades de chave para calcular o código hash.ToString
retorna uma cadeia de caracteres de valores de propriedade concatenados, conforme mostrado no exemplo a seguir. As propriedades chave e não chave estã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 podem entrar em conflito com esses métodos gerados. Ou seja, você não pode usar .Equals
, .GetHashCode
ou .ToString
para nomear uma propriedade.
Definições de tipo anônimo que incluam pelo menos uma propriedade chave também implementam a interface System.IEquatable<T>, onde T
é o tipo do tipo anônimo.
Observação
Declarações de tipo anônimo criam o mesmo tipo anônimo somente se ocorrerem no mesmo assembly, suas propriedades tiverem os mesmos nomes e os mesmos tipos inferidos, as propriedades forem declaradas na mesma ordem e as mesmas propriedades forem marcadas como propriedades de chave.