给定以下类别
public class Foo
{
public int FooId { get; set; }
public string FooName { get; set; }
public override bool Equals(object obj)
{
Foo fooItem = obj as Foo;
if (fooItem == null)
{
return false;
}
return fooItem.FooId == this.FooId;
}
public override int GetHashCode()
{
// Which is preferred?
return base.GetHashCode();
//return this.FooId.GetHashCode();
}
}
我重写了Equals方法,因为Foo表示Foos表的一行。哪个是重写GetHashCode的首选方法?
为什么重写GetHashCode很重要?
通过重写Equals,您基本上表明您更了解如何比较给定类型的两个实例。
下面可以看到ReSharper如何为您编写GetHashCode()函数的示例。请注意,这段代码是由程序员调整的:
public override int GetHashCode()
{
unchecked
{
var result = 0;
result = (result * 397) ^ m_someVar1;
result = (result * 397) ^ m_someVar2;
result = (result * 397) ^ m_someVar3;
result = (result * 397) ^ m_someVar4;
return result;
}
}
正如您所看到的,它只是试图根据类中的所有字段猜测一个好的哈希代码,但如果您知道对象的域或值范围,您仍然可以提供一个更好的哈希代码。
通过重写Equals,您基本上表明您更了解如何比较给定类型的两个实例。
下面可以看到ReSharper如何为您编写GetHashCode()函数的示例。请注意,这段代码是由程序员调整的:
public override int GetHashCode()
{
unchecked
{
var result = 0;
result = (result * 397) ^ m_someVar1;
result = (result * 397) ^ m_someVar2;
result = (result * 397) ^ m_someVar3;
result = (result * 397) ^ m_someVar4;
return result;
}
}
正如您所看到的,它只是试图根据类中的所有字段猜测一个好的哈希代码,但如果您知道对象的域或值范围,您仍然可以提供一个更好的哈希代码。