Помощник по отладке управляемого кода moduloObjectHashcode
Обновлен: Ноябрь 2007
Помощник по отладке управляемого кода (MDA) moduloObjectHashcode изменяет поведение класса Object для выполнения операции по модулю в хэш-коде, возвращаемом методом GetHashCode. Остаток целочисленного деления по умолчанию для данного помощника по отладке управляемого кода равен 1, вследствие чего GetHashCode возвращает значение 0 для всех объектов.
Признаки
После перехода к новой версии среды CLR программа работает некорректно.
Программа получает от коллекции Hashtable неправильный объект.
Сбой в программе произошел в результате изменения порядка перечисления в коллекции Hashtable.
Два объекта, которые ранее были равнозначными, стали неравнозначны.
Два объекта, которые раньше были неравнозначны, стали равнозначными.
Причина
Возможно, программа получает из коллекции Hashtable неправильный объект, поскольку реализация метода Equals в классе, применяемого к ключам коллекции Hashtable, проверяет объекты на предмет равенства путем сравнения результатов вызова метода GetHashCode. Для проверки объектов на равенство не следует использовать хэш-коды, поскольку два объекта могут иметь одинаковый хэш-код даже в том случае, если соответствующие поля объектов содержат различные значения. Возможны конфликты хэш-кода, хотя на практике такое случается редко. В результате это влияет на таблицу подстановки Hashtable следующим образом: два ключа, которые не являются равнозначными, становятся равнозначными, и из коллекции Hashtable возвращается неправильный объект. В целях обеспечения производительности реализация метода GetHashCode может изменяться в зависимости от версии среды выполнения, поэтому конфликты, которые не происходят в одной версии, вполне могут случиться в последующих версиях. Данный помощник по отладке управляемого кода следует активировать, чтобы проверить код на предмет наличия ошибок при возникновении конфликта хэш-кодов. При активации данного помощника по отладке управляемого кода метод GetHashCode возвращает значение 0, в результате чего возникает конфликт всех хэш-кодов. Единственным эффектом включения данного помощника по отладке управляемого кода должно быть некоторое замедление работы программы.
Порядок перечисления в коллекции Hashtable может изменяться в зависимости от версии среды выполнения, если меняется алгоритм, используемый для вычисления хэш-кодов ключа. Чтобы проверить, удалось ли программе устранить из хэш-таблицы зависимость от порядка перечисления ключей или значений, следует включить данный помощник по отладке управляемого кода.
Решение
Нельзя использовать хэш-коды как альтернативу идентификации объекта. Следует реализовать переопределение метода Object.Equals, чтобы избежать сравнения хэш-кодов.
Не следует создавать в хэш-таблицах зависимости от порядка перечисления ключей или значений.
Влияние на среду выполнения
Если данный помощник по отладке управляемого кода включен, работа приложения может замедлиться. Данный помощник по отладке управляемого кода вместо ожидаемого хэш-кода возвращает остаток при делении на абсолютное значение.
Результат
Данный помощник по отладке управляемого кода не дает результата.
Конфигурация
Атрибут modulus определяет остаток целочисленного значения, используемый в хэш-коде. Значением по умолчанию является 1.
<mdaConfig>
<assistants>
<moduloObjectHashcode modulus="1" />
</assistants>
</mdaConfig>
См. также
Основные понятия
Диагностика ошибок посредством управляемых помощников по отладке