可能是重复问题:
当覆盖Equals方法时,为什么重写GetHashCode方法很重要?
在C#中,如果在覆盖Equals()方法时未能重写GetHashCode()方法,会发生什么具体的问题?
可能是重复问题:
当覆盖Equals方法时,为什么重写GetHashCode方法很重要?
在C#中,如果在覆盖Equals()方法时未能重写GetHashCode()方法,会发生什么具体的问题?
将哈希/字典结构视为编号桶的集合。如果您总是将物品放在对应于它们的GetHashCode()的桶中,那么您只需要搜索一个桶(使用Equals())即可查看是否有东西存在。这有效,前提是您正在查找正确的桶。
因此,规则是:如果Equals()表示两个对象相等,则它们必须具有相同的GetHashCode()。
如果您不覆盖GetHashCode
,那么比较您的对象的任何内容都可能出错。
正如所记录的,如果两个实例相等,则GetHashCode
必须返回相同的值,因此希望测试它们是否相等的任何代码都可以使用GetHashCode
作为第一步来分组可能相等的对象(因为它知道具有不同哈希码的对象不能相等)。如果您的GetHashCode
方法为相等的对象返回不同的值,则它们可能在第一遍中进入不同的组,并且永远不会使用其Equals
方法进行比较。
这可能会影响任何集合类型数据结构,但在基于哈希码的数据结构(例如字典和哈希集)中尤为棘手。
简而言之:当您覆盖Equals
时,请始终覆盖GetHashCode
,并确保它们的实现是一致的。