У меня есть несколько объектов с кучей полей, и мне нужно реализовать GetHashCode и Equals. Больно ходить, хотя каждое поле вручную, так что я их написал так:Почему я не должен использовать Equals и GetHashCode, используя отражение?
public override int GetHashCode()
{
int hash = 17;
foreach (PropertyInfo p in GetType().GetProperties())
{
hash = hash * 23 + p.GetValue(this, null).GetHashCode();
}
return hash;
}
public override bool Equals(object obj)
{
foreach (PropertyInfo p in GetType().GetProperties())
{
if (p.GetValue(obj, null) != p.GetValue(this, null))
return false;
}
return true;
}
Помимо соображений скорости, почему я не должен выполнять их, как это?
Помимо вопросов скорости, обратите внимание, что не все правильные реализации «GetHashCode» и «Equals» эквивалентны вышеуказанному алгоритму. Кстати, есть несколько проблем с опубликованным кодом. Вы можете разыменовать «null» в нескольких местах. Кроме того, ваша версия `Equals` использует ссылочное равенство между соответствующими свойствами, которое не является наиболее распространенной идиомой. – Ani 2010-12-07 16:53:05
Забавно, что вы должны спросить, это так. – stimms 2010-12-07 16:53:42
Используйте ReSharper - он будет генерировать правильные реализации `Equals` и` GetHashCode` для вас. – 2010-12-07 16:54:58