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"