Chave (Visual Basic)
A Key
palavra-chave permite especificar o comportamento para propriedades de tipos anônimos. Somente as propriedades que você designa como propriedades chave participam de testes de igualdade entre instâncias de tipo anônimo ou cálculo de valores de código hash. Os valores das propriedades de chave não podem ser alterados.
Você designa uma propriedade de um tipo anônimo como uma propriedade de chave colocando a palavra-chave Key
na frente de sua declaração na lista de inicialização. No exemplo a seguir, Airline
e FlightNo
são propriedades chave, mas Gate
não é.
Dim flight1 = New With {Key .Airline = "Blue Yonder Airlines",
Key .FlightNo = 3554, .Gate = "C33"}
Quando um novo tipo anônimo é criado, ele herda diretamente do Object. O compilador substitui três membros herdados: Equals, GetHashCode, e ToString. O código de substituição que é produzido para Equals e GetHashCode é baseado em propriedades de chave. Se não houver propriedades de chave no tipo GetHashCode e Equals não forem substituídas.
Equality
Duas instâncias de tipo anônimo são iguais se forem instâncias do mesmo tipo e se os valores de suas propriedades de chave forem iguais. Nos exemplos a seguir, flight2
é igual ao flight1
do exemplo anterior porque são instâncias do mesmo tipo anônimo e têm valores correspondentes para suas propriedades de chave. No entanto, flight3
não é igual a flight1
porque tem um valor diferente para uma propriedade de chave, FlightNo
. Instância flight4
não é do mesmo tipo flight1
porque eles designam propriedades diferentes como propriedades de chave.
Dim flight2 = New With {Key .Airline = "Blue Yonder Airlines",
Key .FlightNo = 3554, .Gate = "D14"}
' The following statement displays True. The values of the non-key
' property, Gate, do not have to be equal.
Console.WriteLine(flight1.Equals(flight2))
Dim flight3 = New With {Key .Airline = "Blue Yonder Airlines",
Key .FlightNo = 431, .Gate = "C33"}
' The following statement displays False, because flight3 has a
' different value for key property FlightNo.
Console.WriteLine(flight1.Equals(flight3))
Dim flight4 = New With {Key .Airline = "Blue Yonder Airlines",
.FlightNo = 3554, .Gate = "C33"}
' The following statement displays False. Instance flight4 is not the
' same type as flight1 because they have different key properties.
' FlightNo is a key property of flight1 but not of flight4.
Console.WriteLine(flight1.Equals(flight4))
Se duas instâncias forem declaradas apenas com propriedades não-chave, idênticas em nome, tipo, ordem e valor, as duas instâncias não serão iguais. Uma instância sem propriedades de chave é igual apenas a si mesma.
Para obter mais informações sobre as condições sob as quais duas instâncias de tipo anônimo são instâncias do mesmo tipo anônimo, consulte Tipos anônimos.
Cálculo de código hash
Como Equals, a função de hash definida para um tipo anônimo é baseada nas GetHashCode principais propriedades do tipo. Os exemplos a seguir mostram a interação entre propriedades de chave e valores de código hash.
As instâncias de um tipo anônimo que têm os mesmos valores para todas as propriedades de chave têm o mesmo valor de código hash, mesmo que as propriedades não-chave não tenham valores correspondentes. A instrução a seguir retorna True
.
Console.WriteLine(flight1.GetHashCode = flight2.GetHashCode)
As instâncias de um tipo anônimo que têm valores diferentes para uma ou mais propriedades de chave têm valores de código hash diferentes. A instrução a seguir retorna False
.
Console.WriteLine(flight1.GetHashCode = flight3.GetHashCode)
Instâncias de tipos anônimos que designam propriedades diferentes como propriedades de chave não são instâncias do mesmo tipo. Eles têm valores de código hash diferentes, mesmo quando os nomes e valores de todas as propriedades são os mesmos. A instrução a seguir retorna False
.
Console.WriteLine(flight1.GetHashCode = flight4.GetHashCode)
Valores somente leitura
Os valores das propriedades de chave não podem ser alterados. Por exemplo, nos flight1
exemplos anteriores, os Airline
campos e FlightNo
são somente leitura, mas Gate
podem ser alterados.
' The following statement will not compile, because FlightNo is a key
' property and cannot be changed.
' flight1.FlightNo = 1234
'
' Gate is not a key property. Its value can be changed.
flight1.Gate = "C5"