Если я переопределяю Equals и GetHashCode, как мне решить, какие поля сравнивать? И что произойдет, если у меня есть два объекта с двумя полями каждый, но Equals проверяет только одно поле?Переопределение равных(), но не проверка всех полей - что произойдет?
Другими словами, скажем, у меня есть этот класс:
class EqualsTestClass
{
public string MyDescription { get; set; }
public int MyId { get; set; }
public override bool Equals(object obj)
{
EqualsTestClass eq = obj as EqualsTestClass;
if(eq == null) {
return false;
} else {
return MyId.Equals(eq.MyId);
}
}
public override int GetHashCode()
{
int hashcode = 23;
return (hashcode * 17) + MyId.GetHashCode();
}
}
Я считаю, два объекта равны, если они имеют один и тот же MyId. Поэтому, если Id равен, но описание отличается, они все равно считаются равными.
Мне просто интересно, что такое подводные камни такого подхода? Конечно, конструкция, как это будет вести себя, как и ожидалось:
List<EqualsTestClass> test = new List<EqualsTestClass>();
EqualsTestClass eq1 = new EqualsTestClass();
eq1.MyId = 1;
eq1.MyDescription = "Des1";
EqualsTestClass eq2 = new EqualsTestClass();
eq2.MyId = 1;
eq2.MyDescription = "Des2";
test.Add(eq1);
if (!test.Contains(eq2))
{
// Will not be executed, as test.Contains is true
test.Add(eq2);
}
Как eq2 это значение, равное EQ1, он не будет добавлен. Но это код, который я контролирую, но мне интересно, есть ли код в структуре, который может вызвать непредвиденные проблемы?
Итак, должен ли я всегда добавлять все общедоступные поля в свое сравнение Equals() или какие рекомендации избегать неприятного сюрприза из-за плохой Framework-Mojo, которая была совершенно неожиданной?
договорились, как ОП, я overidden Equals(), чтобы просто проверить первичный идентификатор, и это он, его полностью программисты называют. –