Этот вопрос выходит из обсуждения на tuples.Как C# вычисляет хэш-код для объекта?
Я начал думать о хэш-коде, который должен иметь кортеж. Что делать, если мы примем класс KeyValuePair как кортеж? Он не переопределяет метод GetHashCode(), поэтому, вероятно, он не будет знать хэш-коды его «детей» ... Итак, время выполнения вызовет Object.GetHashCode(), который не знает о реальная структура объекта.
Тогда мы можем сделать два экземпляра некоторого ссылочного типа, которые на самом деле равны, из-за перегруженных GetHashCode() и Equals(). И используйте их как «дети» в кортежах, чтобы «обмануть» словарь.
Но это не сработает! Время выполнения каким-то образом определяет структуру нашего кортежа и вызывает перегруженный GetHashCode нашего класса!
Как это работает? Что такое анализ, сделанный Object.GetHashCode()?
Может ли это повлиять на производительность в некотором плохом сценарии, когда мы используем сложные клавиши? (Вероятно, невозможно сценарий ... но все же)
Рассмотрим этот код в качестве примера:
namespace csharp_tricks
{
class Program
{
class MyClass
{
int keyValue;
int someInfo;
public MyClass(int key, int info)
{
keyValue = key;
someInfo = info;
}
public override bool Equals(object obj)
{
MyClass other = obj as MyClass;
if (other == null) return false;
return keyValue.Equals(other.keyValue);
}
public override int GetHashCode()
{
return keyValue.GetHashCode();
}
}
static void Main(string[] args)
{
Dictionary<object, object> dict = new Dictionary<object, object>();
dict.Add(new KeyValuePair<MyClass,object>(new MyClass(1, 1), 1), 1);
//here we get the exception -- an item with the same key was already added
//but how did it figure out the hash code?
dict.Add(new KeyValuePair<MyClass,object>(new MyClass(1, 2), 1), 1);
return;
}
}
}
Update Я думаю, я нашел объяснение этому, как указано ниже в моем ответе. Основными результатами этого являются:
- Будьте осторожны с ключами и их хэш-кодов :-)
- Для сложных словарных ключей необходимо переопределить Equals() и GetHashCode() правильно.
Это объяснение противоречит примере кода в вопросе , – 2008-09-19 15:47:28