首页 文章

Object.Equals的奇怪实现

提问于
浏览
22

我在读MSDN documentation about object.Equals . 在评论部分提到:

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

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

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

1 回答

  • 49

    基本上,这只对具有有缺陷的 Equals 实现的开发人员有用 . 来自documentation

    以下语句必须适用于Equals(Object)方法的所有实现 . 在列表中,x,y和z表示非空的对象引用 . [...] x.Equals(y)返回与y.Equals(x)相同的值 . [...]

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

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

    基本上,当你覆盖一个方法或实现一个接口时,你应该知道你做了什么,你会得到奇怪的行为,而且我没有理由期望每个调用者都试图解决那些不希望实现的实现 . .

相关问题