Key (Visual Basic)
Słowo Key
kluczowe umożliwia określenie zachowania właściwości typów anonimowych. Tylko właściwości wyznaczane jako kluczowe właściwości uczestniczą w testach równości między wystąpieniami typu anonimowego lub obliczeniami wartości kodu skrótu. Nie można zmienić wartości właściwości klucza.
Właściwość typu anonimowego można wyznaczyć jako właściwość klucza, umieszczając słowo kluczowe Key
przed jego deklaracją na liście inicjowania. W poniższym przykładzie Airline
i FlightNo
są kluczowymi właściwościami, ale Gate
nie.
Dim flight1 = New With {Key .Airline = "Blue Yonder Airlines",
Key .FlightNo = 3554, .Gate = "C33"}
Po utworzeniu nowego typu anonimowego dziedziczy on bezpośrednio z Objectklasy . Kompilator zastępuje trzy dziedziczone elementy członkowskie: Equals, GetHashCodei ToString. Przesłonięć kod tworzony dla Equals elementu i GetHashCode jest oparty na kluczowych właściwościach. Jeśli w typie nie ma żadnych właściwości klucza i GetHashCodeEquals nie są zastępowane.
Równość
Dwa wystąpienia typu anonimowego są równe, jeśli są wystąpieniami tego samego typu i jeśli wartości ich właściwości klucza są równe. W poniższych przykładach wartość jest równa flight1
z poprzedniego przykładu, flight2
ponieważ są wystąpieniami tego samego typu anonimowego i mają pasujące wartości dla ich właściwości klucza. Jednak nie jest równaflight1
, flight3
ponieważ ma inną wartość dla właściwości klucza , FlightNo
. Wystąpienie flight4
nie jest tym samym typem, ponieważ flight1
wyznacza różne właściwości co właściwości klucza.
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))
Jeśli dwa wystąpienia są deklarowane tylko przy użyciu właściwości innych niż klucz, identyczne w nazwie, typie, kolejności i wartości, dwa wystąpienia nie są równe. Wystąpienie bez właściwości klucza jest równe tylko samemu sobie.
Aby uzyskać więcej informacji na temat warunków, w których dwa wystąpienia typu anonimowego są wystąpieniami tego samego typu anonimowego, zobacz Typy anonimowe.
Obliczanie kodu skrótu
Podobnie jak Equals, funkcja skrótu zdefiniowana dla GetHashCode typu anonimowego jest oparta na właściwościach klucza typu. W poniższych przykładach pokazano interakcję między kluczowymi właściwościami i wartościami kodu skrótu.
Wystąpienia typu anonimowego, które mają te same wartości dla wszystkich właściwości klucza, mają tę samą wartość kodu skrótu, nawet jeśli właściwości inne niż klucz nie mają pasujących wartości. Poniższa instrukcja zwraca wartość True
.
Console.WriteLine(flight1.GetHashCode = flight2.GetHashCode)
Wystąpienia typu anonimowego, które mają różne wartości dla co najmniej jednej właściwości klucza, mają różne wartości kodu skrótu. Poniższa instrukcja zwraca wartość False
.
Console.WriteLine(flight1.GetHashCode = flight3.GetHashCode)
Wystąpienia typów anonimowych, które wyznaczają różne właściwości jako właściwości klucza, nie są wystąpieniami tego samego typu. Mają różne wartości kodu skrótu nawet wtedy, gdy nazwy i wartości wszystkich właściwości są takie same. Poniższa instrukcja zwraca wartość False
.
Console.WriteLine(flight1.GetHashCode = flight4.GetHashCode)
Wartości tylko do odczytu
Nie można zmienić wartości właściwości klucza. Na przykład w flight1
poprzednich przykładach Airline
pola i FlightNo
są tylko do odczytu, ale Gate
można je zmienić.
' 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"