我已经阅读了大量关于正确实施Equals()
和GetHashCode()
的文章。我有一些包含许多成员变量的类,我必须实现Equals()
方法。到现在为止还挺好。但是,在实施GetHashCode()
时,我总是陷入寻找良好实施的困境。据我所知,对于某些类,它们永远不会在字典或哈希表中使用,我不想花时间编写一个好的GetHashCode()
实现,所以我提出了以下假设&#34 ;默认"实现:
public override int GetHashCode()
{
Debug.Fail( "If you see this message, implement GetHashCode() properly" );
// Always return the same value for all instances of this class. This ensures
// that two instances which are equal (in terms of their Equals() method)
// have the same hash code.
return 0;
}
如果这是一种可行的方法,我想问你的意见。
一方面,当我不必要时,我不想花时间实施GetHashCode()
。另一方面,我希望我的代码干净有效。上述实现确保具有相同Equals()
结果的两个实例也具有相同的哈希码。当然,如果它真的会被用作字典中的键,那么表现就会很糟糕。但是对于这种情况,你会得到调试断言。
我可能错过了上述方法的任何缺点吗?
答案 0 :(得分:4)
如果你真的不想实现它,我会建议抛出异常(例如NotImplementedException
) - 那么你不仅仅依靠Debug.Fail
工作。如果您在生产环境中遇到这种情况,那么快速失败可能是最佳选择。
但说实话,一旦你实现了平等,通常 非常容易写GetHashCode
(with code like this, perhaps) - 如果它&# 39; s 不那么通常表明你的Equals
方法会违反合同。
请注意GetHashCode
仅用于字典 - 如果您尝试根据类型的键加入LINQ中的两个列表, 也会使用GetHashCode
。基本上,没有实施它违反了最不惊讶的原则。除非你是唯一的人使用你的代码(并且你有一个完美的记忆或者每次使用这种类型时都愿意检查),你应该正确实现它,IMO。