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
表示错误),则它们的哈希码很可能是不同的。由于可供选择的数量有限,因此通常无法进行完美散列。 -
便宜 :在所有情况下计算哈希码应该很便宜。
请参阅: 重载等于()和运算符==的指南