Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Notitie
Dit artikel is specifiek voor .NET Framework. Dit geldt niet voor nieuwere implementaties van .NET, waaronder .NET 6 en nieuwere versies.
De moduloObjectHashcode beheerde foutopsporingsassistent (MDA) wijzigt het gedrag van de Object klasse om een modulo-bewerking uit te voeren op de hash-code die door de GetHashCode methode wordt geretourneerd. De standaardmodulatie voor deze MDA is 1, wat ervoor zorgt dat GetHashCode 0 voor alle objecten wordt geretourneerd.
Symptomen
Na het overstappen op een nieuwe versie van common language runtime (CLR), wordt een programma niet meer goed uitgevoerd:
Het programma krijgt het verkeerde object van een Hashtable.
De volgorde van opsomming van een Hashtable heeft een wijziging die het programma onderbreekt.
Twee objecten die vroeger gelijk waren, zijn niet meer gelijk.
Twee objecten die voorheen niet gelijk waren, zijn nu gelijk.
Oorzaak
Uw programma krijgt mogelijk het verkeerde object van een Hashtable omdat de implementatie van de Equals methode op de klasse voor de sleutel in de Hashtable tests voor gelijkheid van objecten wordt uitgevoerd door de resultaten van de aanroep te vergelijken met de GetHashCode methode. Hash-codes mogen niet worden gebruikt om te testen op object gelijkheid, omdat twee objecten mogelijk dezelfde hashcode hebben, zelfs niet als hun respectieve velden verschillende waarden hebben. Deze hash-codeconflicten, hoewel zelden in de praktijk, optreden. Het effect dat dit heeft op een Hashtable zoekactie is dat twee sleutels die niet gelijk lijken te zijn, gelijk lijken te zijn en het verkeerde object wordt geretourneerd van de Hashtable. Om prestatieredenen kan de implementatie van GetHashCode runtimeversies veranderen, zodat conflicten die zich mogelijk niet op één versie voordoen, zich in volgende versies kunnen voordoen. Schakel deze MDA in om te testen of uw code fouten bevat wanneer hash-codes botsen. Wanneer deze functie is ingeschakeld, zorgt deze MDA ervoor dat de GetHashCode methode 0 retourneert, wat resulteert in een conflict met alle hash-codes. Het enige effect dat deze MDA inschakelt in uw programma, is dat uw programma langzamer wordt uitgevoerd.
De volgorde van opsomming van een kan veranderen van de Hashtable ene versie van de runtime naar een andere als het algoritme dat wordt gebruikt voor het berekenen van de hash-codes voor de sleutelwijziging. Als u wilt testen of uw programma afhankelijk is geworden van de volgorde van opsomming van sleutels of waarden uit een hash-tabel, kunt u deze MDA inschakelen.
Oplossing
Gebruik nooit hashcodes als vervanging voor objectidentiteit. Implementeer de onderdrukking van de Object.Equals methode om hash-codes niet te vergelijken.
Maak geen afhankelijkheden op basis van de volgorde van opsommingen van sleutels of waarden in hashtabellen.
Effect op de runtime
Toepassingen worden langzamer uitgevoerd wanneer deze MDA is ingeschakeld. Deze MDA gebruikt gewoon de hash-code die zou zijn geretourneerd en retourneert in plaats daarvan de rest wanneer deze wordt gedeeld door een modulus.
Uitvoer
Er is geen uitvoer voor deze MDA.
Configuratie
Het modulus kenmerk geeft de modulus op die worden gebruikt voor de hash-code. De standaardwaarde is 1.
<mdaConfig>
<assistants>
<moduloObjectHashcode modulus="1" />
</assistants>
</mdaConfig>