moduloObjectHashcode (MDA)
L'Assistant Débogage managé (MDA, Managed Debugging Assistant) moduloObjectHashcode modifie le comportement de la classe Object pour exécuter une opération modulo sur le code de hachage retourné par la méthode GetHashCode. Le modulo par défaut pour cet Assistant Débogage managé est 1. Dans ce cas, la méthode GetHashCode retourne 0 pour tous les objets.
Symptômes
Après être passé à une nouvelle version du Common Language Runtime (CLR), un programme ne s'exécute plus correctement dans les cas suivants :
Le programme n'obtient pas l'objet correct d'un Hashtable.
L'ordre d'énumération de Hashtable est modifié de telle sorte que le programme s'arrête.
Deux objets auparavant égaux ne le sont plus.
Deux objets auparavant inégaux sont désormais égaux.
Cause
Votre programme peut obtenir l'objet incorrect de Hashtable car l'implémentation de la méthode Equals sur la classe pour obtenir la clé dans Hashtable vérifie l'égalité des objets en comparant les résultats de l'appel à la méthode GetHashCode. Les codes de hachage ne doivent pas être utilisés pour vérifier l'égalité des objets dans la mesure où deux objets peuvent avoir le même code de hachage même si leurs champs respectifs ont des valeurs différentes. Ces collisions de codes de hachage, bien que rares en pratique, peuvent se produire et ont l'effet suivant sur une recherche Hashtable : deux clés qui ne sont pas égales semblent être égales et Hashtable ne retourne pas l'objet correct. Pour des raisons de performance, l'implémentation de GetHashCode peut varier d'une version du runtime à une autre. Par conséquent, des collisions inexistantes dans une version peuvent se produire dans les versions suivantes. Activez cet Assistant Débogage managé pour vérifier si votre code comporte des bogues en cas de collision de codes de hachage. Lorsque cet Assistant Débogage managé est activé, la méthode GetHashCode retourne 0, ce qui se traduit par une collision de tous les codes de hachage. L'activation de cet Assistant ne doit avoir d'autre effet qu'une exécution plus lente de votre programme.
L'ordre d'énumération de Hashtable peut varier d'une version du runtime à une autre si l'algorithme utilisé pour calculer les codes de hachage de la clé change. Pour vérifier si votre programme présente une dépendance vis-à-vis de l'ordre d'énumération des clés ou des valeurs d'une table de hachage, vous pouvez activer cet Assistant Débogage managé.
Solution
N'utilisez jamais de codes de hachage en remplacement de l'identité d'objet. Implémentez la substitution de la méthode Object.Equals pour empêcher la comparaison des codes de hachage.
Ne créez pas de dépendances sur l'ordre des énumérations de clés ou valeurs dans les tables de hachage.
Effet sur le runtime
Les applications s'exécutent plus lentement lorsque cet Assistant Débogage managé est activé. Il prend simplement le code de hachage qui aurait été retourné et retourne à la place son reste lors de sa division par un modulo.
Sortie
Il n'existe pas de sortie pour cet Assistant Débogage managé.
Configuration
L'attribut modulus spécifie le modulo utilisé sur le code de hachage. La valeur par défaut est 1.
<mdaConfig>
<assistants>
<moduloObjectHashcode modulus="1" />
</assistants>
</mdaConfig>
Voir aussi
Référence
Concepts
Diagnostic d'erreurs avec les Assistants de débogage managés