【发布时间】:2014-09-03 14:33:31
【问题描述】:
我已经阅读了大量关于正确实施 Equals() 和 GetHashCode() 的文章。我有一些包含很多成员变量的类,我必须为此实现Equals() 方法。到现在为止还挺好。然而,当我开始实施GetHashCode() 时,我总是在寻找一个好的实施时遇到困难。我知道某些类永远不会在字典或哈希表中使用,我不想花时间编写一个好的 GetHashCode() 实现,所以我想出了以下虚拟“默认”实现:
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() 结果的两个实例也具有相同的哈希码。当然,如果它真的被用作字典中的键,性能会很差。但是对于这种情况,您将获得调试断言。
上述方法是否有我可能遗漏的缺点?
【问题讨论】:
-
看看这个 SO 问题。我不会说它是重复的,但它肯定是相关的:stackoverflow.com/questions/263400/…
-
个人意见:调试和发布构建之间的显着差异(如示例中的崩溃与成功)是个坏主意。
-
@AlexeiLevenkov 这段代码在调试和发布之间没有显着差异。
Debug.Fail是否被执行和忽略没有区别。另请参阅下面我对 Jon Skeet 回答的评论。 -
@Tobias abort/ignore 对话框(控制台/win 表单的 Debug.Fail 的默认实现)确实可以被视为“无操作”......这就是我说“个人意见”的部分原因"。