Nyckel (Visual Basic)
Med nyckelordet Key
kan du ange beteende för egenskaper för anonyma typer. Endast egenskaper som du anger som nyckelegenskaper deltar i tester av likhet mellan anonyma typinstanser eller beräkning av hashkodvärden. Det går inte att ändra värdena för viktiga egenskaper.
Du anger en egenskap av anonym typ som en nyckelegenskap genom att placera nyckelordet Key
framför deklarationen i initieringslistan. I följande exempel Airline
, och FlightNo
är viktiga egenskaper, men Gate
inte.
Dim flight1 = New With {Key .Airline = "Blue Yonder Airlines",
Key .FlightNo = 3554, .Gate = "C33"}
När en ny anonym typ skapas ärver den direkt från Object. Kompilatorn åsidosätter tre ärvda medlemmar: Equals, GetHashCodeoch ToString. Den åsidosättningskod som skapas för Equals och GetHashCode baseras på nyckelegenskaper. Om det inte finns några nyckelegenskaper i typen GetHashCode och Equals inte är åsidosatta.
Tillämplig
Två anonyma typinstanser är lika om de är instanser av samma typ och om värdena för deras nyckelegenskaper är lika. I följande exempel flight2
är lika flight1
med från föregående exempel eftersom de är instanser av samma anonyma typ och de har matchande värden för sina nyckelegenskaper. Är dock flight3
inte lika med flight1
eftersom den har ett annat värde för en nyckelegenskap, FlightNo
. Instansen flight4
är inte samma typ som flight1
eftersom de anger olika egenskaper som nyckelegenskaper.
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))
Om två instanser deklareras med endast icke-nyckelegenskaper, identiska i namn, typ, ordning och värde, är de två instanserna inte lika. En instans utan nyckelegenskaper är bara lika med sig själv.
Mer information om de villkor under vilka två anonyma typinstanser är instanser av samma anonyma typ finns i Anonyma typer.
Hash-kodberäkning
Precis som Equalsbaseras hash-funktionen som definieras i GetHashCode för en anonym typ på nyckelegenskaperna för typen. I följande exempel visas interaktionen mellan nyckelegenskaper och hashkodvärden.
Instanser av en anonym typ som har samma värden för alla nyckelegenskaper har samma hashkodvärde, även om icke-nyckelegenskaper inte har matchande värden. Följande instruktion returnerar True
.
Console.WriteLine(flight1.GetHashCode = flight2.GetHashCode)
Instanser av en anonym typ som har olika värden för en eller flera nyckelegenskaper har olika hashkodvärden. Följande instruktion returnerar False
.
Console.WriteLine(flight1.GetHashCode = flight3.GetHashCode)
Instanser av anonyma typer som anger olika egenskaper som nyckelegenskaper är inte instanser av samma typ. De har olika hash-kodvärden även när namnen och värdena för alla egenskaper är desamma. Följande instruktion returnerar False
.
Console.WriteLine(flight1.GetHashCode = flight4.GetHashCode)
Skrivskyddade värden
Det går inte att ändra värdena för viktiga egenskaper. I de tidigare exemplen är fälten Airline
och FlightNo
till exempel flight1
skrivskyddade, men Gate
kan ändras.
' 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"