Как реализация .NET Dictionary работает с изменяемыми объектами

Я понимаю, что не рекомендуется использовать «изменяемые» объекты (объекты, чей метод GetHashCode () может возвращать разные результаты, когда они используются в качестве ключей вСловарь).

Ниже мое понимание того, как работает словарь, который реализован как хеш-таблица:

Когда я добавляю новый ключ, напримерdict.Add(m1, "initially here was m1 object");, dict вычисляет хеш-кодm1 с помощьюGetHashCode() метод. Затем он выполняет некоторые внутренние вычисления и, наконец, помещает этот объект в некоторую позицию своего внутреннего массива.

Когда я использую индекс ключа, чтобы получить значение, напримерdict[m1], dict снова вычисляет хеш-код Затем он выполняет некоторые внутренние вычисления и дает мне объект, который находится в вычисленной позиции внутри его внутреннего массива.

Но я думаю, что есть ошибка, которую я не могу найти.

Итак, давайте предположим, что у меня есть этот код:

    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);
   }

Когда я звонюMutate методы, ключи меняются местами. Поэтому я подумал, что это даст обмен местами. Но на самом деле эта строка:Console.WriteLine("dict[m1] = " + dict[m1]); выдает KeyNotFoundException, и я не могу понять, почему. Очевидно, я что-то здесь упускаю ...

Ответы на вопрос(3)

Ваш ответ на вопрос