Megosztás a következőn keresztül:


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>

Lásd még