moduloObjectHashcode (MDA)

Nota

Questo articolo è specifico per .NET Framework. Non si applica alle implementazioni più recenti di .NET, incluse .NET 6 e versioni successive.

L'assistente al debug gestito moduloObjectHashcode modifica il comportamento della classe Object per eseguire un'operazione modulo sul codice hash restituito dal metodo GetHashCode. Il modulo predefinito per questo assistente al debug gestito è 1, che fa sì che GetHashCode restituisca 0 per tutti gli oggetti.

Sintomi

Dopo la migrazione a una nuova versione di Common Language Runtime (CLR), un programma non viene più eseguito correttamente:

  • Il programma ottiene un oggetto non corretto da una Hashtable.

  • L'ordine di enumerazione da una Hashtable include una modifica che compromette il funzionamento del programma.

  • Due oggetti che erano uguali non sono più uguali.

  • Due oggetti che erano diversi sono ora uguali.

Causa

È 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. 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. Queste collisioni di codici hash, anche se nella pratica si tratta di eventi rari, possono verificarsi. L'effetto su una ricerca Hashtable è che due chiavi diverse risultano apparentemente uguali e Hashtable restituisce un oggetto non corretto. 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. Abilitare questo assistente al debug gestito per verificare se il codice include bug in caso di collisioni di codici hash. Quando questo assistente al debug gestito viene abilitato, il metodo GetHashCode restituisce 0, quindi tutti i codici hash risultano in collisione. L'unico effetto dell'abilitazione di questo assistente al debug gestito sul programma è un rallentamento dell'esecuzione.

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. 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.

Risoluzione

Non usare mai codici hash in sostituzione all'identità dell'oggetto. Implementare l'override del metodo Object.Equals per non confrontare i codici hash.

Non creare dipendenze dall'ordine di enumerazione delle chiavi o dei valori nelle tabelle hash.

Effetto sull'ambiente di esecuzione

Le applicazioni vengono eseguite più lentamente quando si abilita questo assistente al debug gestito. Questo assistente al debug gestito accetta semplicemente il codice hash che sarebbe stato restituito e restituisce invece il resto della divisione di un modulo.

Output

Non è previsto alcun output per questo assistente al debug gestito.

Impostazione

L'attributo modulus specifica il modulo usato sul codice hash. Il valore predefinito è 1.

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

Vedi anche