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>