Поделиться через


moduloObjectHashcode MDA

Примечание.

Эта статья относится к .NET Framework. Он не применяется к более новым реализациям .NET, включая .NET 6 и более поздние версии.

Помощник по отладке управляемого кода (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>

См. также