Kulcs (Visual Basic)
A Key
kulcsszó lehetővé teszi a névtelen típusok tulajdonságainak viselkedésének megadását. Csak a kulcstulajdonságként megjelölt tulajdonságok vesznek részt a névtelen típusú példányok közötti egyenlőség vizsgálatában vagy a kivonatkódértékek kiszámításában. A kulcstulajdonságok értékei nem módosíthatók.
Egy névtelen típusú tulajdonságot kulcstulajdonságként jelölhet ki, ha a kulcsszót Key
a deklaráció elé helyezi az inicializálási listában. A következő példában Airline
FlightNo
kulcstulajdonságok, de Gate
nem.
Dim flight1 = New With {Key .Airline = "Blue Yonder Airlines",
Key .FlightNo = 3554, .Gate = "C33"}
Új névtelen típus létrehozásakor az közvetlenül a rendszertől Objectörököl. A fordító három öröklött tagot felülbírál: Equals, GetHashCodeés ToString. A kulcstulajdonságokon alapuló felülbírálási kód EqualsGetHashCode . Ha nincsenek kulcstulajdonságok a típusban, GetHashCode és Equals nincsenek felülírva.
Egyenlőség
Két névtelen típusú példány egyenlő, ha azonos típusú példányok, és ha a kulcstulajdonságok értéke egyenlő. Az alábbi példákban megegyezik flight1
az előző példával, flight2
mivel azonos névtelen típusú példányok, és a kulcstulajdonságuknak megfelelő értékekkel rendelkeznek. Ez azonban nem egyenlő azzalflight1
, flight3
hogy egy kulcstulajdonság más értékkel rendelkezik. FlightNo
A példány flight4
nem ugyanaz a típus, mint flight1
mivel különböző tulajdonságokat jelölnek ki kulcstulajdonságként.
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))
Ha két példány csak nem kulcstulajdonságokkal van deklarálva, névben, típusban, sorrendben és értékben azonos, akkor a két példány nem egyenlő. Egy kulcstulajdonságokat nem tartalmazó példány csak önmagával egyenlő.
További információ arról, hogy milyen feltételek mellett két névtelen típusú példány azonos névtelen típusú példány, olvassa el a Névtelen típusok című témakört.
Kivonatkód kiszámítása
A névtelen típushoz GetHashCode definiált kivonatfüggvény például Equalsa típus kulcstulajdonságán alapul. Az alábbi példák a kulcstulajdonságok és a kivonatkódértékek közötti interakciót mutatják be.
A névtelen típusú példányok, amelyek minden kulcstulajdonság esetében azonos értékekkel rendelkeznek, ugyanazzal a kivonatkód-értékkel rendelkeznek, még akkor is, ha a nem kulcstulajdonságok nem rendelkeznek egyező értékekkel. A következő utasítás ad True
vissza.
Console.WriteLine(flight1.GetHashCode = flight2.GetHashCode)
A névtelen típusú példányok, amelyek egy vagy több kulcstulajdonság különböző értékeivel rendelkeznek, eltérő kivonatkódértékekkel rendelkeznek. A következő utasítás ad False
vissza.
Console.WriteLine(flight1.GetHashCode = flight3.GetHashCode)
Azok a névtelen típusok, amelyek különböző tulajdonságokat jelölnek kulcstulajdonságként, nem azonos típusú példányok. Eltérő kivonatkódértékekkel rendelkeznek akkor is, ha az összes tulajdonság neve és értéke megegyezik. A következő utasítás ad False
vissza.
Console.WriteLine(flight1.GetHashCode = flight4.GetHashCode)
Írásvédett értékek
A kulcstulajdonságok értékei nem módosíthatók. A korábbi példákban flight1
például a Airline
mezők írásvédettek FlightNo
, de Gate
módosíthatók.
' 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"