Equals 和 GetHashCode

Equals 的每个实现都必须满足以下要求:

  • 反身 :一个物体必须与自己相等。
    x.Equals(x) 返回 true

  • 对称 :如果我将 x 与 y 或 y 与 x 进行比较没有区别 - 结果是相同的。
    x.Equals(y) 返回与 y.Equals(x) 相同的值。

  • 传递 :如果一个对象等于另一个对象而该对象等于第三个对象,则第一个对象必须等于第三个对象。
    如果 (x.Equals(y) && y.Equals(z)) 返回 true,则 x.Equals(z) 返回 true

  • 一致 :如果多次将对象与另一个对象进行比较,结果始终相同。
    只要未修改 x 和 y 引用的对象,x.Equals(y) 的连续调用将返回相同的值。

  • 与 null 的比较 :没有对象等于 null
    x.Equals(null) 返回 false

GetHashCode 的实现:

  • Equals 兼容 :如果两个对象相等(意味着 Equals 返回 true),则 GetHashCode 必须为每个对象返回相同的值。

  • 大范围 :如果两个对象不相等(Equals 表示错误),则它们的哈希码很可能是不同的。由于可供选择的数量有限,因此通常无法进行完美散列。

  • 便宜 :在所有情况下计算哈希码应该很便宜。

请参阅: 重载等于()和运算符==的指南