Udostępnij za pośrednictwem


moduloObjectHashcode MDA

Uwaga

Ten artykuł jest specyficzny dla programu .NET Framework. Nie ma zastosowania do nowszych implementacji platformy .NET, w tym .NET 6 i nowszych wersji.

Asystent moduloObjectHashcode zarządzanego debugowania (MDA) zmienia zachowanie Object klasy w celu wykonania operacji modulo na kodzie skrótu zwróconym przez metodę GetHashCode . Domyślny modulus dla tego MDA to 1, co powoduje GetHashCode zwrócenie wartości 0 dla wszystkich obiektów.

Objawy

Po przejściu do nowej wersji środowiska uruchomieniowego języka wspólnego (CLR) program nie jest już prawidłowo wykonywany:

  • Program otrzymuje niewłaściwy obiekt z obiektu Hashtable.

  • Kolejność wyliczenia z elementu Hashtable ma zmianę, która przerywa działanie programu.

  • Dwa obiekty, które kiedyś były równe, nie są już równe.

  • Dwa obiekty, które kiedyś nie były równe, są teraz równe.

Przyczyna

Twój program może uzyskać niewłaściwy obiekt z obiektu, Hashtable ponieważ implementacja Equals metody w klasie klucza Hashtable do testów równości obiektów przez porównanie wyników wywołania metody do GetHashCode metody . Kody skrótów nie powinny być używane do testowania równości obiektów, ponieważ dwa obiekty mogą mieć ten sam kod skrótu, nawet jeśli ich pola mają różne wartości. Te kolizje kodu skrótu, choć rzadkie w praktyce, występują. Efektem tego Hashtable wyszukiwania jest to, że dwa klucze, które nie są równe, wydają się być równe, a niewłaściwy obiekt jest zwracany z Hashtable. Ze względu na wydajność implementacja GetHashCode programu może ulec zmianie między wersjami środowiska uruchomieniowego, więc kolizje, które mogą nie wystąpić w jednej wersji, mogą wystąpić w kolejnych wersjach. Włącz tę usługę MDA, aby sprawdzić, czy kod zawiera usterki w przypadku kolidowania kodów skrótów. Po włączeniu GetHashCode tej usługi MDA metoda zwraca wartość 0, co powoduje kolizję wszystkich kodów skrótów. Jedynym skutkiem włączenia tej usługi MDA powinno być w programie, jest to, że program działa wolniej.

Kolejność wyliczenia z elementu Hashtable może ulec zmianie z jednej wersji środowiska uruchomieniowego na inną, jeśli algorytm używany do obliczania kodów skrótu dla zmiany klucza. Aby sprawdzić, czy program podjął zależność od kolejności wyliczania kluczy lub wartości z tabeli skrótów, możesz włączyć tę usługę MDA.

Rozwiązanie

Nigdy nie należy używać kodów skrótów jako podstawy tożsamości obiektu. Zaimplementuj przesłonięcia metody , Object.Equals aby nie porównywać kodów skrótów.

Nie twórz zależności od kolejności wyliczania kluczy lub wartości w tabelach skrótów.

Wpływ na środowisko uruchomieniowe

Aplikacje działają wolniej, gdy ta usługa MDA jest włączona. To MDA po prostu przyjmuje kod skrótu, który zostałby zwrócony i zamiast tego zwraca resztę po podzieleniu przez modulus.

Wyjście

Brak danych wyjściowych dla tej usługi MDA.

Konfigurowanie

Atrybut modulus określa modulus używany w kodzie skrótu. Domyślna wartość wynosi 1.

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

Zobacz też