我的理解是,您通常应该将 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();
}
}
这个想法是,我想根据属性 A 和 B 的值将 Foo 的一个实例与另一个实例进行比较。如果 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!
这些都为 GetHashCode() 生成值 3,导致 Equals() 返回 true。显然,这是一个简单的示例,并且只有两个属性,我可以简单地比较 Equals() 方法中的各个属性。但是,对于更复杂的类,这将很快失控。
我知道有时只设置一次哈希码并始终返回相同的值是很有意义的。但是,对于需要评估相等性的可变对象,我认为这是不合理的。
在实现 GetHashCode() 时处理可以轻松互换的属性值的最佳方法是什么?
也可以看看