Насколько я понимаю, вы, как правило, должны использовать xor с GetHashCode (), чтобы создать int для идентификации ваших данных по их значению (в отличие от ссылки). Вот простой пример:
class Foo
{
int m_a;
int m_b;
public int A
{
get { return m_a; }
set { m_a = value; }
}
public int B
{
get { return m_b; }
set { m_b = value; }
}
public Foo(int a, int b)
{
m_a = a;
m_b = b;
}
public override int GetHashCode()
{
return A ^ B;
}
public override bool Equals(object obj)
{
return this.GetHashCode() == obj.GetHashCode();
}
}
Идея в том, что я хочу сравнить один экземпляр Foo с другим на основе значения свойств A и B. Если Foo1.A == Foo2.A и Foo1.B == Foo2.B, то мы имеем равенство .
Вот проблема:
Foo one = new Foo(1, 2);
Foo two = new Foo(2, 1);
if (one.Equals(two)) { ... } // This is true!
Они оба выдают значение 3 для GetHashCode (), в результате чего Equals () возвращает true. Очевидно, это тривиальный пример, и только с двумя свойствами я мог бы просто сравнить отдельные свойства в методе Equals (). Однако с более сложным классом это быстро вышло бы из-под контроля.
Я знаю, что иногда имеет смысл установить хеш-код только один раз и всегда возвращать одно и то же значение. Однако, для изменчивых объектов, где оценка равенства необходима, я не думаю, что это разумно.
Каков наилучший способ обработки значений свойств, которые можно легко заменить при реализации GetHashCode ()?
См. Также
Каков наилучший алгоритм для переопределенного System.Object.GetHashCode?