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()
结果的两个实例也具有相同的哈希代码。当然,如果它真的被用作字典中的键,性能会很差。但是对于这种情况,您将得到调试断言。
上面的方法有没有我可能遗漏的缺点?
如果你真的不想实现它,我建议你抛出一个异常(例如NotImplementedException
),那么你就不仅仅依赖于Debug.Fail
了。如果在生产环境中出现这种情况,那么快速失败可能是最好的选择。
但老实说,一旦实现了平等,编写GetHashCode
(可能使用这样的代码)通常非常容易,如果这不容易,那么这通常是Equals
方法无论如何都会违反其合同的迹象。
请注意,GetHashCode
不仅仅用于字典-如果您尝试在LINQ中基于您类型的键连接两个列表,则也将使用GetHashCode
。基本上,不执行它违反了最不令人惊讶的原则。除非你是唯一使用代码的人(并且你有完美的记忆力,或者每次使用类型时都愿意检查),否则你应该正确地实现它