Freigeben über


Key (Visual Basic)

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

Sie legen eine Eigenschaft eines anonymen Typs als Schlüsseleigenschaft fest, indem Sie das Schlüsselwort Key vor der Deklaration in der Initialisierungsliste platzieren. Im folgenden Beispiel Airline sind sie FlightNo schlüsseleigenschaften, aber Gate nicht.

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

Wenn ein neuer anonymer Typ erstellt wird, erbt er direkt von Object. Der Compiler setzt drei geerbte Member außer Kraft: Equals, , GetHashCodeund ToString. Der Außerkraftsetzungscode, der für Equals die Schlüsseleigenschaften erstellt wird und GetHashCode basiert. Wenn im Typ GetHashCode keine Schlüsseleigenschaften vorhanden sind und Equals nicht überschrieben werden.

Gleichheit

Zwei anonyme Typinstanzen sind gleich, wenn sie Instanzen desselben Typs sind und die Werte ihrer Schlüsseleigenschaften gleich sind. In den folgenden Beispielen ist gleich flight1 dem vorherigen Beispiel, flight2 da sie Instanzen desselben anonymen Typs sind und übereinstimmende Werte für ihre Schlüsseleigenschaften aufweisen. Ist jedoch nicht gleichflight1, flight3 da er einen anderen Wert für eine Schlüsseleigenschaft hat. FlightNo Die Instanz flight4 ist nicht derselbe Typ wie flight1 , da sie unterschiedliche Eigenschaften als Schlüsseleigenschaften 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))

Wenn zwei Instanzen nur mit Nichtschlüsseleigenschaften deklariert werden, identisch mit Name, Typ, Reihenfolge und Wert, sind die beiden Instanzen nicht gleich. Eine Instanz ohne Schlüsseleigenschaften ist nur für sich selbst gleich.

Weitere Informationen zu den Bedingungen, unter denen zwei Instanzen des anonymen Typs Instanzen desselben anonymen Typs sind, finden Sie unter "Anonyme Typen".

Hashcodeberechnung

Wie Equalsfolgt basiert die Hashfunktion, die für einen anonymen Typ definiert GetHashCode ist, auf den wichtigsten Eigenschaften des Typs. Die folgenden Beispiele zeigen die Interaktion zwischen schlüsseleigenschaften und Hashcodewerten.

Instanzen eines anonymen Typs, die dieselben Werte für alle Schlüsseleigenschaften aufweisen, weisen denselben Hashcodewert auf, auch wenn nicht schlüsselbezogene Eigenschaften keine übereinstimmenden Werte aufweisen. Die folgende Anweisung gibt zurück True.

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

Instanzen eines anonymen Typs, die unterschiedliche Werte für eine oder mehrere Schlüsseleigenschaften haben, weisen unterschiedliche Hashcodewerte auf. Die folgende Anweisung gibt zurück False.

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

Instanzen anonymer Typen, die unterschiedliche Eigenschaften als Schlüsseleigenschaften festlegen, sind keine Instanzen desselben Typs. Sie weisen unterschiedliche Hashcodewerte auf, auch wenn die Namen und Werte aller Eigenschaften gleich sind. Die folgende Anweisung gibt zurück False.

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

Read-Only Werte

Die Werte der Schlüsseleigenschaften können nicht geändert werden. In den früheren Beispielen sind die Airline Felder FlightNo beispielsweise flight1 schreibgeschützt, können aber Gate geändert werden.

' 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