Как реализация .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, и я не могу понять, почему. Очевидно, я что-то здесь упускаю ...