Key (Visual Basic)

KeyKlíčové slovo umožňuje zadat chování pro vlastnosti anonymních typů. Pouze vlastnosti, které označíte jako klíčové vlastnosti, se účastní testů rovnosti mezi instancemi anonymního typu nebo výpočtů hodnot kódů hash. Hodnoty vlastností klíče nelze změnit.

Vlastnost anonymního typu určujete jako vlastnost klíče umístěním klíčového slova Key před jeho deklarací v inicializačním seznamu. V následujícím příkladu Airline a FlightNo jsou klíčové vlastnosti, ale Gate ne.

Dim flight1 = New With {Key .Airline = "Blue Yonder Airlines",
                        Key .FlightNo = 3554, .Gate = "C33"}

Při vytvoření nového anonymního typu se zdědí přímo z Object . Kompilátor přepíše tři zděděné členy: Equals , a GetHashCode ToString . Kód přepsání, který je vytvořen pro Equals a GetHashCode je založen na vlastnostech klíče. Pokud typ neobsahuje žádné klíčové vlastnosti GetHashCode a Equals nejsou přepsány.

Rovnost

Dvě instance anonymního typu jsou stejné, pokud jsou instance stejného typu a jsou-li hodnoty jejich klíčových vlastností stejné. V následujících příkladech flight2 je rovno flight1 z předchozího příkladu, protože jsou instancemi stejného anonymního typu a mají shodné hodnoty pro své klíčové vlastnosti. Není však flight3 rovno, flight1 protože má jinou hodnotu pro klíčovou vlastnost FlightNo . Instance flight4 není stejného typu, flight1 protože určuje různé vlastnosti jako klíčové vlastnosti.

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 deklarovány dvě instance s pouze neklíčovým vlastností, které jsou stejné jako název, typ, pořadí a hodnota, tyto dvě instance se neshodují. Instance bez vlastností klíče je stejná jenom pro sebe sama.

Další informace o podmínkách, za kterých jsou dvě instance anonymního typu instance stejného anonymního typu, naleznete v tématu anonymní typy.

Výpočet kódu hash

Podobně Equals funkce hash, která je definována v GetHashCode pro anonymní typ, je založena na klíčových vlastnostech typu. Následující příklady znázorňují interakci mezi vlastnostmi klíče a hodnotami hash kódu.

Instance anonymního typu, které mají stejné hodnoty pro všechny vlastnosti klíče, mají stejnou hodnotu hash kódu, a to i v případě, že vlastnosti bez klíče nemají odpovídající hodnoty. Vrátí následující příkaz 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í jiné hodnoty kódu hash. Vrátí následující příkaz False .

Console.WriteLine(flight1.GetHashCode = flight3.GetHashCode)

Instance anonymních typů, které určují různé vlastnosti jako klíčové vlastnosti, nejsou instancemi stejného typu. Mají různé hodnoty hash kódu, a to i v případě, že jsou názvy a hodnoty všech vlastností stejné. Vrátí následující příkaz False .

Console.WriteLine(flight1.GetHashCode = flight4.GetHashCode)

Read-Only hodnoty

Hodnoty vlastností klíče nelze změnit. Například v flight1 předchozích příkladech Airline FlightNo jsou pole a určena jen pro čtení, ale Gate lze 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é