Dela via


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"

Se även