Key (Visual Basic)

La palabra clave Key permite especificar el comportamiento de las propiedades de tipos anónimos. Solo las propiedades que designe como propiedades clave participan en pruebas de igualdad entre instancias de tipo anónimo o cálculo de valores de código hash. Los valores de las propiedades clave no se pueden cambiar.

Designe una propiedad de un tipo anónimo como una propiedad clave colocando la palabra clave Key delante de su declaración en la lista de inicialización. En el ejemplo siguiente, Airline y FlightNo son propiedades clave, pero Gate no.

Dim flight1 = New With {Key .Airline = "Blue Yonder Airlines",
                        Key .FlightNo = 3554, .Gate = "C33"}

Cuando se crea un nuevo tipo anónimo, hereda directamente de Object. El compilador invalida tres miembros heredados: Equals, GetHashCode y ToString. El código de invalidación que se genera para Equals y GetHashCode se basa en las propiedades clave. Si no hay propiedades clave en el tipo, GetHashCode y Equals no se invalidan.

Igualdad

Dos instancias de tipo anónimo son iguales si son instancias del mismo tipo y si los valores de sus propiedades clave son iguales. En los ejemplos siguientes, flight2 es igual que flight1 en el ejemplo anterior porque son instancias del mismo tipo anónimo y tienen valores coincidentes para sus propiedades clave. Sin embargo, flight3 no es igual a flight1 porque tiene un valor diferente para una propiedad clave, FlightNo. La instancia flight4 no es el mismo tipo que flight1 porque designan propiedades diferentes como propiedades clave.

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))

Si dos instancias se declaran solo con propiedades que no son clave, pero que son idénticas en nombre, tipo, orden y valor, las dos instancias no son iguales. Una instancia sin propiedades clave solo es igual a sí misma.

Para obtener más información sobre las condiciones en las que dos instancias de tipo anónimo son instancias del mismo tipo anónimo, consulte Tipos anónimos.

Cálculo de código hash

Al igual que Equals, la función hash que se define en GetHashCode para un tipo anónimo se basa en las propiedades clave del tipo. En los ejemplos siguientes se muestra la interacción entre las propiedades clave y los valores de código hash.

Las instancias de un tipo anónimo que tienen los mismos valores para todas las propiedades de clave tienen el mismo valor de código hash, incluso si las propiedades que no son clave no tienen valores coincidentes. La siguiente instrucción devuelve True.

Console.WriteLine(flight1.GetHashCode = flight2.GetHashCode)

Las instancias de un tipo anónimo que tienen valores diferentes para una o varias propiedades clave tienen valores de código hash diferentes. La siguiente instrucción devuelve False.

Console.WriteLine(flight1.GetHashCode = flight3.GetHashCode)

Las instancias de tipos anónimos que designan propiedades diferentes como propiedades clave no son instancias del mismo tipo. Tienen valores de código hash diferentes incluso cuando los nombres y valores de todas las propiedades son iguales. La siguiente instrucción devuelve False.

Console.WriteLine(flight1.GetHashCode = flight4.GetHashCode)

Valores de solo lectura

Los valores de las propiedades clave no se pueden cambiar. Por ejemplo, en flight1 en los ejemplos anteriores, los campos Airline y FlightNo son de solo lectura, pero Gate se puede cambiar.

' 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 también