如果在重写 Equals() 方法时未重写 GetHashCode() 方法,有什么可能出错的情况?

23 浏览
0 Comments

如果在重写 Equals() 方法时未重写 GetHashCode() 方法,有什么可能出错的情况?

这个问题已经有答案了

可能是重复的:

为什么在覆盖 Equals 方法时重写 GetHashCode 方法很重要?

在C#中,如果在覆盖Equals()方法时不重写GetHashCode()方法,会出现什么问题?

admin 更改状态以发布 2023年5月23日
0
0 Comments

把哈希/字典结构想象成一个由编号桶组成的集合。如果你总是把东西放在对应其 GetHashCode() 的桶中,那么你只需要搜索一个桶(使用 Equals())即可查看是否有东西在那里。只要你在正确的桶中查找,这种方法是有效的。

所以规则是:如果 Equals() 表示两个对象相等,则它们必须具有相同的 GetHashCode()。

0
0 Comments

最常见的方式是为结构映射。

如果任何类使用此方法,则在作为字典或哈希表的键时将具有不可预测的行为。原因在于实现使用both GetHashCode和Equals正确地在表中查找值。 算法的简短版本如下:

  1. 通过桶的数量取HashCode的模,这是桶的索引
  2. 为指定的Key和特定bucket中的每个Key调用.Equals()
  3. 如果存在匹配项,则为该值,没有匹配项则没有值。

如果未能保持GetHashCode和Equals同步,则会完全破坏此算法(以及其他许多算法)。

0