moduloObjectHashcode MDA
Feljegyzés
Ez a cikk a .NET-keretrendszer vonatkozik. Ez nem vonatkozik a .NET újabb implementációira, beleértve a .NET 6-os és újabb verzióit.
A moduloObjectHashcode
felügyelt hibakeresési segéd (MDA) megváltoztatja az Object osztály viselkedését, hogy modulo műveletet hajt végre a metódus által GetHashCode visszaadott kivonatkódon. Ennek az MDA-nak az alapértelmezett modulusa 1, ami az összes objektum esetében 0 értéket ad GetHashCode vissza.
Hibajelenségek
A közös nyelvi futtatókörnyezet (CLR) új verziójára való áttérés után a program már nem fut megfelelően:
A program rossz objektumot kap egy Hashtable.
A számbavétel sorrendje egy olyan változással Hashtable rendelkezik, amely megszakítja a programot.
A korábban egyenlő két objektum már nem egyenlő.
Két, korábban nem egyenlő objektum egyenlő.
Ok
Előfordulhat, hogy a program rossz objektumot kap egy Hashtable olyantól, amely miatt a metódus implementálása Equals a kulcs osztályában az Hashtable objektumok egyenlőségi tesztjeibe a metódushoz GetHashCode való hívás eredményeinek összehasonlításával történik. A kivonatkódok nem használhatók az objektumok egyenlőségének ellenőrzésére, mert két objektum akkor is ugyanazt a kivonatkódot használhatja, még akkor is, ha a mezők eltérő értékekkel rendelkeznek. Ezek a kivonatkód ütközések, bár a gyakorlatban ritkán fordulnak elő. Ennek a keresésre Hashtable gyakorolt hatása az, hogy két, nem egyenlő kulcs egyenlőnek tűnik, és a rendszer a helytelen objektumot adja vissza a Hashtable. Teljesítménybeli okokból a implementáció GetHashCode változhat a futtatókörnyezeti verziók között, így előfordulhat, hogy az ütközések nem egy verzióban következnek be a következő verziókban. Engedélyezze ezt az MDA-t annak teszteléséhez, hogy a kódban vannak-e hibák a kivonatkódok ütközésekor. Ha engedélyezve van, ez az GetHashCode MDA 0 értéket ad vissza a metódusnak, így az összes kivonatkód ütközik. Az MDA engedélyezésének egyetlen hatása az, hogy a program lassabban fut.
A számbavétel sorrendje a Hashtable futtatókörnyezet egyik verziójáról a másikra változhat, ha a kulcsmódosítás kivonatkódjainak kiszámításához használt algoritmus. Annak ellenőrzéséhez, hogy a program függőséget vett-e a kulcsok vagy értékek számbavételének sorrendjében egy kivonattáblából, engedélyezheti ezt az MDA-t.
Resolution (Osztás)
Soha ne használjon kivonatkódokat az objektumdentitás helyettesítőjeként. Implementálja a metódus felülbírálását, Object.Equals hogy ne hasonlítsa össze a kivonatkódokat.
Ne hozzon létre függőségeket a kulcsok vagy értékek számbavételének sorrendjében a kivonattáblákban.
Effektus a futtatókörnyezetre
Az alkalmazások lassabban futnak, ha ez az MDA engedélyezve van. Ez az MDA egyszerűen a visszaadott kivonatkódot használja, és ehelyett a maradékot adja vissza modulusokkal osztva.
Hozam
Ehhez az MDA-hoz nincs kimenet.
Konfiguráció
Az modulus
attribútum megadja a kivonatkódban használt modulust. Az alapértelmezett érték 1.
<mdaConfig>
<assistants>
<moduloObjectHashcode modulus="1" />
</assistants>
</mdaConfig>