Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Примечание.
Эта статья относится к .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>