Object.GetHashCode Metódus
Definíció
Fontos
Egyes információk olyan, kiadás előtti termékekre vonatkoznak, amelyek a kiadásig még jelentősen módosulhatnak. A Microsoft nem vállal kifejezett vagy törvényi garanciát az itt megjelenő információért.
Ez az alapértelmezett kivonatoló függvény.
public:
virtual int GetHashCode();
public virtual int GetHashCode();
abstract member GetHashCode : unit -> int
override this.GetHashCode : unit -> int
Public Overridable Function GetHashCode () As Integer
Válaszok
Az aktuális objektum kivonatkódja.
Megjegyzések
Az API-val kapcsolatos további információkért tekintse meg az Object.GetHashCode kiegészítő API-megjegyzéseit.
Megjegyzések az öröklőkhöz
A kivonatfüggvények segítségével gyorsan létrehozhat egy objektum értékének megfelelő számot (kivonatkódot). A kivonatfüggvények általában minden típusra jellemzőek, és az egyediség érdekében a példánymezők közül legalább egyet bemenetként kell használni. A kivonatkódokat nem szabad statikus mezők értékeivel kiszámítani.
A származtatott Objectosztályok esetében a GetHashCode metódus csak akkor delegálható az alaposztály-implementációhoz GetHashCode() , ha a származtatott osztály az egyenlőséget hivatkozási egyenlőségnek határozza meg. A referenciatípusok alapértelmezett implementációja GetHashCode() egy olyan kivonatkódot ad vissza, amely megegyezik a GetHashCode(Object) metódus által visszaadotttal. A nem módosítható referenciatípusok felülbírálhatók GetHashCode() . A nem módosítható referenciatípusok esetében általában csak a következő esetekben kell felülbírálni GetHashCode() :
A kivonatkódot olyan mezőkből is kiszámíthatja, amelyek nem módosíthatók; Vagy
Meggyőződhet arról, hogy egy mutable objektum kivonatkódja nem változik, miközben az objektum a kivonatkódjára támaszkodó gyűjteményben található.
Ellenkező esetben azt gondolhatja, hogy a mutable objektum elveszik a kivonattáblában. Ha úgy dönt, hogy felülbírál GetHashCode() egy mutable referenciatípust, a dokumentációnak egyértelművé kell tennie, hogy a típus felhasználói nem módosíthatják az objektumértékeket, miközben az objektumot kivonattáblában tárolják.
Értéktípusok esetén egy alapértelmezett kivonatkód-implementációt biztosít, GetHashCode() amely tükröződést használ. A jobb teljesítmény érdekében érdemes megfontolni a felülkondírozást.
További információkért és példákért, amelyek különböző módokon számítják ki a kivonatkódokat, tekintse meg a Példák szakaszt.
A kivonatoló függvénynek a következő tulajdonságokkal kell rendelkeznie:
Ha két objektum egyenlőként hasonlít össze, az GetHashCode() egyes objektumok metódusának ugyanazt az értéket kell visszaadnia. Ha azonban két objektum nem egyenlő, a GetHashCode() két objektum metódusainak nem kell eltérő értékeket visszaadnia.
Az GetHashCode() objektum metódusának következetesen ugyanazt a kivonatkódot kell visszaadnia, ha az objektum állapotának módosítása nem határozza meg az objektum System.Object.Equals metódusának visszatérési értékét. Vegye figyelembe, hogy ez csak az alkalmazás aktuális végrehajtására igaz, és egy másik kivonatkód is visszaadható, ha az alkalmazás újra fut.
A legjobb teljesítmény érdekében a kivonatfüggvénynek egyenletes eloszlást kell létrehoznia az összes bemenethez, beleértve az erősen fürtözött bemeneteket is. Ennek az a következménye, hogy az objektumállapot kis módosításainak nagy módosításokat kell eredményeznie az eredményként kapott kivonatkódon a legjobb kivonattábla-teljesítmény érdekében.
A kivonatfüggvények számítása olcsó.
A GetHashCode() metódus nem vethet ki kivételeket.
Az osztály által String biztosított metódus implementációja GetHashCode() például azonos sztringértékek azonos kivonatkódjait adja vissza. Ezért két String objektum ugyanazt a kivonatkódot adja vissza, ha ugyanazt a sztringértéket képviseli. Emellett a metódus a sztringben szereplő összes karaktert használja a véletlenszerűen elosztott kimenet létrehozásához, még akkor is, ha a bemenet bizonyos tartományokba van csoportosítva (például sok felhasználó rendelkezhet olyan sztringekkel, amelyek csak az alsó 128 ASCII-karaktert tartalmazzák, annak ellenére, hogy egy sztring a 65 535 Unicode-karakter bármelyikét tartalmazhatja).
Ha egy osztályban jó kivonatfüggvényt ad meg, az jelentősen befolyásolhatja az objektumok kivonattáblához való hozzáadásának teljesítményét. A kivonatoló függvény megfelelő megvalósítását biztosító kulcsokat tartalmazó kivonattáblákban az elem keresése állandó időt vesz igénybe (például O(1) művelet). A kivonatoló függvény gyenge implementációját tartalmazó kivonattáblákban a keresés teljesítménye a kivonattáblában lévő elemek számától függ (például egy O(n) művelettől, ahol n a kivonatoló tábla elemeinek száma. A rosszindulatú felhasználók olyan adatokat adhatnak meg, amelyek növelik az ütközések számát, ami jelentősen csökkentheti a kivonattábláktól függő alkalmazások teljesítményét a következő feltételek mellett:
Ha a kivonatfüggvények gyakori ütközéseket okoznak.
Ha egy kivonattáblában lévő objektumok nagy része olyan kivonatkódokat hoz létre, amelyek egyenlőek vagy közel azonosak egymással.
Amikor a felhasználók olyan adatokat adnak meg, amelyekből a kivonatkódot kiszámítják.
A felülbíráló GetHashCode() származtatott osztályokat is felül kell bírálni Equals(Object) annak biztosítása érdekében, hogy két egyenlőnek ítélt objektum ugyanazzal a kivonatkóddal rendelkezzen; ellenkező esetben előfordulhat, hogy a Hashtable típus nem működik megfelelően.