Sdílet prostřednictvím


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"

Viz také