Key (Visual Basic)

Mit dem Schlüsselwort Key können Sie das Verhalten für Eigenschaften anonymer Typen angeben. Nur Eigenschaften, die Sie als Key-Eigenschaften festlegen, nehmen an Übereinstimmungstests zwischen anonymen Typinstanzen oder an der Berechnung von Hashcodewerten teil. Die Werte von Key-Eigenschaften können nicht geändert werden.

Platzieren Sie in der Initialisierungsliste das Schlüsselwort Key vor der Deklaration einer Eigenschaft eines anonymen Typs, um sie als Key-Eigenschaft festzulegen. Im folgenden Beispiel sind Airline und FlightNo Key-Eigenschaften, Gate jedoch nicht.

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

Ein neu erstellter anonymer Typ erbt direkt von Object. Der Compiler überschreibt die drei geerbten Member Equals, GetHashCode und ToString. Der Überschreibungscode, der für Equals und GetHashCode erstellt wird, basiert auf Key-Eigenschaften. Enthält der Typ keine Key-Eigenschaften, werden GetHashCode und Equals nicht überschrieben.

Gleichheit

Zwei anonyme Typinstanzen sind gleich, wenn sie demselben Typ angehören und die Werte ihrer Key-Eigenschaften identisch sind. In den folgenden Beispielen sind flight2 und flight1 aus dem vorherigen Beispiel gleich, da es sich um Instanzen desselben anonymen Typs handelt mit übereinstimmenden Werten für ihre Key-Eigenschaften. flight3 und flight1 stimmen jedoch nicht überein aufgrund des unterschiedlichen Werts der Key-Eigenschaft FlightNo. Die Instanzen flight4 und flight1 weisen nicht den gleichen Typ auf, da sie verschiedene Eigenschaften als Key-Eigenschaften festlegen.

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

Werden zwei Instanzen nur mit nicht Key-basierten Eigenschaften deklariert, die in Name, Typ, Reihenfolge und Wert identisch sind, sind die beiden Instanzen nicht gleich. Eine Instanz ohne Key-Eigenschaften ist nur mit sich selbst identisch.

Weitere Informationen zu den Bedingungen, unter denen zwei anonyme Typinstanzen dem gleichen anonymen Typ angehören, finden Sie unter Anonyme Typen.

Hashcodeberechnung

Wie Equals basiert die Hashfunktion, die in GetHashCode für einen anonymen Typ definiert ist, auf den Key-Eigenschaften des Typs. Die folgenden Beispiele veranschaulichen die Interaktion zwischen Key-Eigenschaften und Hashcodewerten.

Instanzen eines anonymen Typs mit den gleichen Werte für alle Key-Eigenschaften weisen den gleichen Hashcodewert auf, selbst wenn die nicht Key-basierten Eigenschaften keine übereinstimmenden Werte aufweisen. Die folgende Anweisung gibt True zurück.

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

Instanzen eines anonymen Typs mit unterschiedlichen Werten für eine oder mehrere Key-Eigenschaften weisen unterschiedliche Hashcodewerte auf. Die folgende Anweisung gibt False zurück.

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

Instanzen anonymer Typen, die unterschiedliche Eigenschaften als Key-Eigenschaften festlegen, sind keine Instanzen desselben Typs. Sie verfügen über unterschiedliche Hashcodewerte, selbst wenn die Namen und Werte aller Eigenschaften identisch sind. Die folgende Anweisung gibt False zurück.

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

Schreibgeschützte Werte

Die Werte von Key-Eigenschaften können nicht geändert werden. In den vorherigen Beispielen sind die Felder Airline und FlightNo in flight1 beispielsweise schreibgeschützt, während Gate geändert werden kann.

' 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"

Siehe auch