C#:如何静态的Object.Equals检查平等?(C#: How does the static

2019-07-18 16:09发布

假设你有两个不同的类,每个都有自己的执行的Equals; 哪一个是使用? 如果只有其中一人有什么呢? 或者他们没有? 是否有任何以下行的相同呢?

object .Equals( first, second )
first .Equals( second )
second .Equals( first )

我猜,前两个可能是等价的,但我真的没有线索。

这是什么真的?

Answer 1:

基本上,它做了三两件事:

  • 检查引用相等(如果这样返回true)
  • 检查参考无效(返回false,如果任一值为null;现在空== NULL案件已处理)
  • 检查与价值相等first.Equals(second)

排序不应该的问题,如果这两个值都乖巧平等的实现,作为平等应该被实现,使得x.Equals(y)意味着y.Equals(x) 不过,我已经安装了离线文档中则状态first.Equals(二)(或objA.equals(objB)使用真正的参数命名)中规定。 该在线文档并没有提到这一点,有趣的是。

只是为了让这一切混凝土,实施看起来是这样的:

public static bool Equals(object x, object y)
{
    if (x == y) // Reference equality only; overloaded operators are ignored
    {
        return true;
    }
    if (x == null || y == null) // Again, reference checks
    {
        return false;
    }
    return x.Equals(y); // Safe as we know x != null.
}


Answer 2:

默认情况下,物体等效性通过在内存中的对象的地址确定。 如果这两种情况下具有相同的内存地址,他们是平等的。

然而,这可以在对象内被重载以使得开发者可以比较arn't在相同的存储器位置,并且仍然被认为是相等的两个对象。 举例来说,如果你有一个数据访问层,每个对象从数据库具有数据记录的ID,你可以有基于ID对象相等比较。

你可以重载运算符来产生这种功能。



文章来源: C#: How does the static object.Equals check for equality?