Partilhar via


moduloObjectHashcode MDA

The moduloObjectHashcode gerenciado Assistente de depuração (MDA) altera o comportamento das Object classe para executar um módulo operação no código hash retornado pela GetHashCode método. O módulo padrão para este MDA é 1, o que faz com que GetHashCode para retornar a 0 para todos os objetos.

Sintomas

Depois de mover para uma nova versão do Common linguagem tempo de execução (CLR), um programa não executa corretamente:

  • O programa está obtendo o objeto errado de um Hashtable.

  • A ordem de enumeração de um Hashtable tem uma alterar que interrompe o programa.

  • Dois objetos usados para ser igual não são mais iguais.

  • Dois objetos usados para não ser iguais agora são iguais.

Causa

O programa pode estar recebendo o objeto errado por um Hashtable porque a implementação das Equals método na classe para a chave para o Hashtable testes de igualdade de objetos, comparando os resultados da telefonar para o GetHashCode método. Códigos de hash devem ser usados para teste igualdade de objeto porque dois objetos podem ter o mesmo hash código mesmo seus respectivos campos tenham valores diferentes.Esses colisões de código hash, embora seja raro na prática, ocorrem.O efeito que isso tem em um Hashtable pesquisa é que aparecem de duas chaves que não são iguais para que seja igual, e o objeto incorreto é retornado das Hashtable. Por motivos de desempenho, a implementação de GetHashCode pode alterar entre versões de tempo de execução, para que as colisões podem ocorrer em uma versão não podem ocorrer em versões subseqüentes. Habilitar este MDA para teste se seu código possui bugs quando entrarem em conflito códigos de hash.Quando ativado, este MDA faz com que o GetHashCode método para retornar 0, resultando em todos os códigos de hash colliding. O efeito apenas ativar que este MDA deverá ter em seu programa é que o programa seja executado mais lentamente.

A ordem de enumeração de um Hashtable pode mudar de uma versão do tempo de execução para outro se alterar o algoritmo usado para calcular os códigos de hash para a chave. Para testar se o seu programa executou uma dependência da ordem de enumeração de chaves ou valores de uma tabela de hash, você pode habilitar este MDA.

Resolução

Nunca use códigos de hash sistema autônomo um substituto para a identidade do objeto.Implementar a substituir do Object.Equals método para comparar não códigos de hash.

Não crie dependências no fim das enumerações de chaves ou valores em tabelas de hash.

Efeito sobre o tempo de execução

Os aplicativos executados mais lentamente quando este MDA é habilitado.Este MDA simplesmente pega código hash que poderia ter sido retornado e, em vez disso, retorna o resto quando dividido por um módulo.

Saída

Não há nenhuma saída para este MDA.

Configuração

The modulus atributo especifica os módulos usados no código hash. O valor padrão é 1.

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

Consulte também

Conceitos

Diagnosticar erros com assistentes de depuração gerenciadas

Referência

Object.GetHashCode

Object.Equals