如果不需要,GetHashCode()虚拟实现

时间:2014-09-03 14:33:32

标签: c# .net hash

我已经阅读了大量关于正确实施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()结果的两个实例也具有相同的哈希码。当然,如果它真的会被用作字典中的键,那么表现就会很糟糕。但是对于这种情况,你会得到调试断言。

我可能错过了上述方法的任何缺点吗?

1 个答案:

答案 0 :(得分:4)

如果你真的不想实现它,我会建议抛出异常(例如NotImplementedException) - 那么你不仅仅依靠Debug.Fail工作。如果您在生产环境中遇到这种情况,那么快速失败可能是最佳选择。

但说实话,一旦你实现了平等,通常 非常容易写GetHashCodewith code like this, perhaps) - 如果它&# 39; s 那么通常表明你的Equals方法会违反合同。

请注意GetHashCode 仅用于字典 - 如果您尝试根据类型的键加入LINQ中的两个列表, 也会使用GetHashCode。基本上,没有实施它违反了最不惊讶的原则。除非你是唯一的人使用你的代码(并且你有一个完美的记忆或者每次使用这种类型时都愿意检查),你应该正确实现它,IMO。