Key (Visual Basic)
Klíčové Key
slovo umožňuje zadat chování vlastností anonymních typů. Pouze vlastnosti, které určíte jako klíčové vlastnosti, se účastní testů rovnosti mezi instancemi anonymního typu nebo výpočtem hodnot hash kódu. Hodnoty vlastností klíče nelze změnit.
Vlastnost anonymního typu označíte jako vlastnost klíče umístěním klíčového slova Key
před jeho deklaraci do seznamu inicializace. V následujícím příkladu Airline
jsou FlightNo
klíčové vlastnosti, ale Gate
nejsou.
Dim flight1 = New With {Key .Airline = "Blue Yonder Airlines",
Key .FlightNo = 3554, .Gate = "C33"}
Když je vytvořen nový anonymní typ, dědí přímo z Object. Kompilátor přepíše tři zděděné členy: Equals, GetHashCodea ToString. Přepsání kódu vytvořeného pro Equals klíčové vlastnosti a GetHashCode je založeno na klíčových vlastnostech. Pokud typ GetHashCode neobsahuje žádné vlastnosti klíče a Equals nejsou přepsány.
Rovnost
Dvě instance anonymního typu jsou stejné, pokud jsou instance stejného typu a pokud jsou hodnoty jejich vlastností klíče stejné. V následujících příkladech se rovná flight1
předchozímu příkladu, flight2
protože jsou instancemi stejného anonymního typu a mají odpovídající hodnoty pro vlastnosti klíče. Není však rovenflight1
, flight3
protože má jinou hodnotu pro vlastnost klíče, FlightNo
. Instance flight4
není stejného typu jako flight1
proto, že označují různé vlastnosti jako vlastnosti klíče.
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))
Pokud jsou dvě instance deklarovány pouze s vlastnostmi bez klíče, shodnými v názvu, typem, pořadím a hodnotou, tyto dvě instance se nerovnají. Instance bez vlastností klíče se rovná pouze sobě.
Další informace o podmínkách, za kterých jsou dvě instance anonymního typu instancemi stejného anonymního typu, naleznete v tématu Anonymní typy.
Výpočet kódu hash
Podobně jako Equalsfunkce hash, která je definována GetHashCode pro anonymní typ, je založena na klíčových vlastnostech typu. Následující příklady ukazují interakci mezi vlastnostmi klíče a hodnotami kódu hash.
Instance anonymního typu, které mají stejné hodnoty pro všechny vlastnosti klíče, mají stejnou hodnotu kódu hash, i když vlastnosti bez klíče nemají odpovídající hodnoty. Následující příkaz vrátí True
.
Console.WriteLine(flight1.GetHashCode = flight2.GetHashCode)
Instance anonymního typu, které mají různé hodnoty pro jednu nebo více vlastností klíče, mají různé hodnoty hash kódu. Následující příkaz vrátí False
.
Console.WriteLine(flight1.GetHashCode = flight3.GetHashCode)
Instance anonymních typů, které označují různé vlastnosti jako vlastnosti klíče, nejsou instance stejného typu. Mají různé hodnoty hash kódu, i když jsou názvy a hodnoty všech vlastností stejné. Následující příkaz vrátí False
.
Console.WriteLine(flight1.GetHashCode = flight4.GetHashCode)
Hodnoty jen pro čtení
Hodnoty vlastností klíče nelze změnit. Například v flight1
předchozích příkladech Airline
jsou pole FlightNo
jen pro čtení, ale Gate
je možné je změnit.
' 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"