GetHashCode()伪实现(如果不需要)

本文关键字:如果不 不需要 如果 GetHashCode 实现 | 更新日期: 2023-09-27 18:20:34

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

上面的方法有没有我可能遗漏的缺点?

GetHashCode()伪实现(如果不需要)

如果你真的不想实现它,我建议你抛出一个异常(例如NotImplementedException),那么你就不仅仅依赖于Debug.Fail了。如果在生产环境中出现这种情况,那么快速失败可能是最好的选择。

但老实说,一旦实现了平等,编写GetHashCode(可能使用这样的代码)通常非常容易,如果这不容易,那么这通常是Equals方法无论如何都会违反其合同的迹象。

请注意,GetHashCode不仅仅用于字典-如果您尝试在LINQ中基于您类型的键连接两个列表,则也将使用GetHashCode。基本上,不执行它违反了最不令人惊讶的原则。除非你是唯一使用代码的人(并且你有完美的记忆力,或者每次使用类型时都愿意检查),否则你应该正确地实现它