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"

Consulte também