moduloObjectHashcode (MDA)moduloObjectHashcode MDA

L'assistente al debug gestito moduloObjectHashcode modifica il comportamento della classe Object per eseguire un'operazione modulo sul codice hash restituito dal metodo GetHashCode.The moduloObjectHashcode managed debugging assistant (MDA) changes the behavior of the Object class to perform a modulo operation on the hash code returned by the GetHashCode method. Il modulo predefinito per questo assistente al debug gestito è 1, che fa sì che GetHashCode restituisca 0 per tutti gli oggetti.The default modulus for this MDA is 1, which causes GetHashCode to return 0 for all objects.

SintomiSymptoms

Dopo la migrazione a una nuova versione di Common Language Runtime (CLR), un programma non viene più eseguito correttamente:After moving to a new version of the common language runtime (CLR), a program no longer executes properly:

  • Il programma ottiene un oggetto non corretto da una Hashtable.The program is getting the wrong object from a Hashtable.

  • L'ordine di enumerazione da una Hashtable include una modifica che compromette il funzionamento del programma.The order of enumeration from a Hashtable has a change that breaks the program.

  • Due oggetti che erano uguali non sono più uguali.Two objects that used to be equal are no longer equal.

  • Due oggetti che erano diversi sono ora uguali.Two objects that used to not be equal are now equal.

CausaCause

È possibile che il programma ottenga l'oggetto non corretto da una Hashtable perché l'implementazione del metodo Equals nella classe per la chiave in Hashtable verifica l'uguaglianza degli oggetti confrontando i risultati della chiamata al metodo GetHashCode.Your program may be getting the wrong object from a Hashtable because the implementation of the Equals method on the class for the key into the Hashtable tests for equality of objects by comparing the results of the call to the GetHashCode method. Non è consigliabile usare i codici hash per verificare l'uguaglianza di oggetti perché due oggetti possono avere lo stesso codice hash, anche se i rispettivi campi hanno valori diversi.Hash codes should not be used to test for object equality because two objects may have the same hash code even if their respective fields have different values. Queste collisioni di codici hash, anche se nella pratica si tratta di eventi rari, possono verificarsi.These hash code collisions, although rare in practice, do occur. L'effetto su una ricerca Hashtable è che due chiavi diverse risultano apparentemente uguali e Hashtable restituisce un oggetto non corretto.The effect this has on a Hashtable lookup is that two keys which are not equal appear to be equal, and the wrong object is returned from the Hashtable. Per motivi di prestazioni, l'implementazione di GetHashCode può cambiare tra versioni di runtime diverse, quindi potrebbero verificarsi collisioni in una versione e non nelle versioni successive.For performance reasons, the implementation of GetHashCode can change between runtime versions, so collisions that might not occur on one version might occur on subsequent versions. Abilitare questo assistente al debug gestito per verificare se il codice include bug in caso di collisioni di codici hash.Enable this MDA to test whether your code has bugs when hash codes collide. Quando questo assistente al debug gestito viene abilitato, il metodo GetHashCode restituisce 0, quindi tutti i codici hash risultano in collisione.When enabled, this MDA causes the GetHashCode method to return 0, resulting in all hash codes colliding. L'unico effetto dell'abilitazione di questo assistente al debug gestito sul programma è un rallentamento dell'esecuzione.The only effect enabling this MDA should have on your program is that your program runs slower.

L'ordine di enumerazione da una Hashtable può variare tra le diverse versioni di runtime se cambia l'algoritmo usato per calcolare i codici hash per la chiave.The order of enumeration from a Hashtable may change from one version of the runtime to another if the algorithm used to compute the hash codes for the key change. Per verificare se il programma ha una dipendenza dall'ordine di enumerazione delle chiavi o dei valori da una tabella hash, è possibile abilitare questo assistente al debug gestito.To test whether your program has taken a dependency on the order of enumeration of keys or values out of a hash table, you can enable this MDA.

RisoluzioneResolution

Non usare mai codici hash in sostituzione all'identità dell'oggetto.Never use hash codes as a substitute for object identity. Implementare l'override del metodo Object.Equals per non confrontare i codici hash.Implement the override of the Object.Equals method to not compare hash codes.

Non creare dipendenze dall'ordine di enumerazione delle chiavi o dei valori nelle tabelle hash.Do not create dependencies on the order of enumerations of keys or values in hash tables.

Effetto sull'ambiente di esecuzioneEffect on the Runtime

Le applicazioni vengono eseguite più lentamente quando si abilita questo assistente al debug gestito.Applications run more slowly when this MDA is enabled. Questo assistente al debug gestito accetta semplicemente il codice hash che sarebbe stato restituito e restituisce invece il resto della divisione di un modulo.This MDA simply takes the hash code that would have been returned and instead returns the remainder when divided by a modulus.

OutputOutput

Non è previsto alcun output per questo assistente al debug gestito.There is no output for this MDA.

ConfigurazioneConfiguration

L'attributo modulus specifica il modulo usato sul codice hash.The modulus attribute specifies the modulus used on the hash code. Il valore predefinito è 1.The default value is 1.

<mdaConfig>  
  <assistants>  
    <moduloObjectHashcode modulus="1" />  
  </assistants>  
</mdaConfig>  

Vedere ancheSee Also

Object.GetHashCode
Object.Equals
Diagnostica degli errori tramite gli assistenti al debug gestitoDiagnosing Errors with Managed Debugging Assistants