繁体   English   中英

Object.Equals的奇怪实现

[英]Strange implementation of Object.Equals

我正在阅读有关object.EqualsMSDN文档 在评论部分提到:

如果两个对象不表示相同的对象引用且都不为null,则它调用objA.Equals(objB)并返回结果。 这意味着如果objA重写Object.Equals(Object)方法,则调用此覆盖。

我的问题是为什么他们没有将这个部分实现为objA.Equals(objB) && objB.Equals(objA)以使等式对称并且只关系到关系的一边? 调用object.Equals时可能会导致奇怪的行为。

编辑:当objA的类型覆盖Equals方法并将其实现为不可预测的东西时,可能会发生奇怪的行为,但objB的类型不会覆盖Equals

基本上,这只对具有有缺陷的Equals实现的开发人员有用。 文档

对于Equals(Object)方法的所有实现,以下语句必须为true。 在列表中, xyz表示非空的对象引用。

  • [...]
  • x.Equals(y)返回与y.Equals(x)相同的值。
  • [...]

因此,在正确实施该方法的每种情况下,检查都是多余的 - 对每个做出正确事情的开发人员造成性能损失。

它对于没有做正确事情的开发人员来说甚至不是非常有用,因为他们可能仍然期望object.Equals(x, y)在返回true时返回false - 他们可以调试并发现他们的方法返回true,毕竟。 你可以说它会记录下来检查两种方式 - 但是我们已经确定了影响的唯一开发人员是那些不读文档的人。

基本上,当您覆盖方法或实现接口时,您应该知道您正在做什么并遵守指定的合同。 如果你不这样做,你得到奇怪的行为,我不认为期望每个调用者尝试解决那些不符合他们意图的实现是合理的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM