Sleutel (Visual Basic)
Met Key
het trefwoord kunt u gedrag opgeven voor eigenschappen van anonieme typen. Alleen eigenschappen die u als sleuteleigenschappen aanwijst, nemen deel aan tests van gelijkheid tussen anonieme type instanties of het berekenen van hashcodewaarden. De waarden van sleuteleigenschappen kunnen niet worden gewijzigd.
U wijst een eigenschap van een anoniem type aan als een sleuteleigenschap door het trefwoord Key
vóór de declaratie in de initialisatielijst te plaatsen. In het volgende voorbeeld Airline
zijn dit FlightNo
belangrijke eigenschappen, maar Gate
niet.
Dim flight1 = New With {Key .Airline = "Blue Yonder Airlines",
Key .FlightNo = 3554, .Gate = "C33"}
Wanneer een nieuw anoniem type wordt gemaakt, wordt dit rechtstreeks overgenomen van Object. De compiler overschrijft drie overgenomen leden: Equals, GetHashCodeen ToString. De onderdrukkingscode die wordt geproduceerd voor Equals en GetHashCode is gebaseerd op sleuteleigenschappen. Als er geen sleuteleigenschappen in het type GetHashCode zijn en Equals niet worden overschreven.
Equality
Twee anonieme exemplaren zijn gelijk als ze exemplaren van hetzelfde type zijn en als de waarden van de sleuteleigenschappen gelijk zijn. In de volgende voorbeelden is dit flight2
gelijk aan flight1
uit het vorige voorbeeld, omdat ze exemplaren van hetzelfde anonieme type zijn en ze overeenkomende waarden hebben voor hun sleuteleigenschappen. flight3
Is echter niet gelijk aan flight1
omdat deze een andere waarde heeft voor een sleuteleigenschap, FlightNo
. Het exemplaar flight4
is niet hetzelfde type omdat flight1
ze verschillende eigenschappen als sleuteleigenschappen aanwijzen.
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))
Als twee exemplaren worden gedeclareerd met alleen niet-sleuteleigenschappen, identiek in naam, type, volgorde en waarde, zijn de twee exemplaren niet gelijk. Een exemplaar zonder sleuteleigenschappen is alleen gelijk aan zichzelf.
Zie Anonieme typen voor meer informatie over de voorwaarden waaronder twee anonieme exemplaren exemplaren van hetzelfde anonieme type zijn.
Hashcodeberekening
De hash-functie die is gedefinieerd GetHashCode voor een anoniem type, is bijvoorbeeld Equalsgebaseerd op de sleuteleigenschappen van het type. In de volgende voorbeelden ziet u de interactie tussen sleuteleigenschappen en hashcodewaarden.
Exemplaren van een anoniem type met dezelfde waarden voor alle sleuteleigenschappen hebben dezelfde hashcodewaarde, zelfs als niet-sleuteleigenschappen geen overeenkomende waarden hebben. De volgende instructie retourneert True
.
Console.WriteLine(flight1.GetHashCode = flight2.GetHashCode)
Exemplaren van een anoniem type met verschillende waarden voor een of meer sleuteleigenschappen hebben verschillende hashcodewaarden. De volgende instructie retourneert False
.
Console.WriteLine(flight1.GetHashCode = flight3.GetHashCode)
Exemplaren van anonieme typen die verschillende eigenschappen aanwijzen als sleuteleigenschappen, zijn geen exemplaren van hetzelfde type. Ze hebben verschillende hash-codewaarden, zelfs wanneer de namen en waarden van alle eigenschappen hetzelfde zijn. De volgende instructie retourneert False
.
Console.WriteLine(flight1.GetHashCode = flight4.GetHashCode)
Alleen-lezen waarden
De waarden van sleuteleigenschappen kunnen niet worden gewijzigd. In de eerdere voorbeelden zijn de Airline
velden FlightNo
bijvoorbeeld flight1
alleen-lezen, maar Gate
kunnen ze worden gewijzigd.
' 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"