Chave (Visual Basic)
A palavra-chave Key
permite que você especifique o comportamento de propriedades de tipos anônimos. Somente as propriedades designadas como propriedades-chave participam de testes de igualdade entre instâncias de tipo anônimo ou de cálculo de valores de código hash. Os valores das propriedades chave não podem ser alterados.
Você designa uma propriedade de um tipo anônimo como uma propriedade-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 de Object. O compilador substitui três membros herdados: Equals, GetHashCode e ToString. O código de substituição que é produzido para Equals e GetHashCode se baseia nas propriedades-chave. Se não houver propriedades-chave no tipo, GetHashCode e Equals não serão substituídas.
Igualitário
Duas instâncias de tipo anônimo são iguais se são instâncias do mesmo tipo e se os valores de suas propriedades-chave são 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-chave. No entanto, flight3
não é igual a flight1
porque tem um valor diferente para uma propriedade-chave, FlightNo
. A instância flight4
não é do mesmo tipo de flight1
porque designam propriedades diferentes como propriedades-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, elas não serão iguais. Uma instância sem propriedades-chave é igual apenas a si mesma.
Para saber mais sobre as condições nas quais duas instâncias de tipo anônimo são instâncias do mesmo tipo anônimo, confira Tipos anônimos.
Cálculo do código de hash
Assim como Equals, a função de hash definida em GetHashCode para um tipo anônimo baseia-se nas propriedades-chave do tipo. Os exemplos a seguir mostram a interação entre propriedades-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-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 tenham valores diferentes para uma ou mais propriedades-chave têm valores de código hash diferentes. A instrução a seguir retorna False
.
Console.WriteLine(flight1.GetHashCode = flight3.GetHashCode)
As instâncias de tipos anônimos que designam propriedades diferentes como propriedades-chave não são instâncias do mesmo tipo. Elas têm valores de código hash diferentes mesmo quando os nomes e valores de todas as propriedades são iguais. A instrução a seguir retorna False
.
Console.WriteLine(flight1.GetHashCode = flight4.GetHashCode)
Valores somente leitura
Os valores das propriedades chave não podem ser alterados. Por exemplo, em flight1
nos exemplos anteriores, os campos Airline
e FlightNo
são somente leitura, mas Gate
pode ser alterado.
' 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"