Compartilhar via


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"

Confira também