Jak działa implementacja słownika .NET ze zmiennymi obiektami

Rozumiem, że nie zaleca się używania obiektów „mutable” (obiektów, których metoda GetHashCode () może zwracać różne wyniki, gdy są używane jako klucze wSłownik).

Poniżej znajduje się moje zrozumienie działania słownika, który jest zaimplementowany jako tablica mieszania:

Na przykład, gdy dodam nowy kluczdict.Add(m1, "initially here was m1 object");, dict oblicza kod hash zm1 używającGetHashCode() metoda. Następnie wykonuje pewne wewnętrzne obliczenia i ostatecznie umieszcza ten obiekt w jakiejś pozycji wewnętrznej tablicy.

Kiedy używam indeksu kluczy, aby uzyskać wartość, na przykładdict[m1], dict ponownie oblicza kod hash. Następnie wykonuje pewne wewnętrzne obliczenia i daje mi obiekt, który znajduje się w obliczonej pozycji wewnątrz jego wewnętrznego układu.

Ale myślę, że jest błąd, którego nie mogę znaleźć.

Załóżmy więc, że mam ten kod:

    class MutableObject
    {
         Int32 m_value;

         public MutableObject(Int32 value)
         {
             m_value = value;
         }

         public void Mutate(Int32 value)
         {
             m_value = value;
         }

         public override int GetHashCode()
         {
             return m_value;
         }
   }

   static void Main(string[] args)
   {
         MutableObject m1 = new MutableObject(1);
         MutableObject m2 = new MutableObject(2);

         var dict = new Dictionary<MutableObject, String>();
         dict.Add(m1, "initially here was m1 object");
         dict.Add(m2, "initially here was m2 object");

         Console.WriteLine("Before mutation:");
         Console.WriteLine("dict[m1] = " + dict[m1]);
         Console.WriteLine("dict[m2] = " + dict[m2]);

         m1.Mutate(2);
         m2.Mutate(1);

         Console.WriteLine("After mutation:");
         Console.WriteLine("dict[m1] = " + dict[m1]);
         Console.WriteLine("dict[m2] = " + dict[m2]);

         Console.ReadKey(true);
   }

Kiedy dzwonięMutate metody, klucze są zamieniane. Pomyślałem więc, że da to zamienione wyniki. Ale tak naprawdę ta linia:Console.WriteLine("dict[m1] = " + dict[m1]); zgłasza wyjątek KeyNotFoundException i nie rozumiem dlaczego. Oczywiście brakuje mi tutaj czegoś ...

questionAnswers(3)

yourAnswerToTheQuestion