C#:静态object.Equals如何检查是否相等?

时间:2009-09-20 17:00:32

标签: c# object static equals

假设您有两个不同的类,每个类都有自己的Equals实现;使用哪一个?如果只有一个人有一个怎么办?或者他们都没有?以下任何一行是否相同?

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

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

它到底是做什么的?

2 个答案:

答案 0 :(得分:40)

基本上它做了三件事:

  • 检查引用相等性(如果是,则返回true)
  • 检查引用nullity(如果任一值为null,则返回false;此时已处理null == null的情况)
  • 使用first.Equals(second)
  • 检查值是否相等

如果两个值都具有良好的等式实现,则排序不应该重要,因为应该实现等式,x.Equals(y)暗示y.Equals(x)。但是,我安装的脱机文档确实指出first.Equals(second)(或objA.equals(objB)使用真实参数命名)。 online documentation并没有提到这一点,有趣的是。

为了使所有这些具体化,实现可能如下所示:

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.
}

答案 1 :(得分:1)

默认情况下,对象等效性由对象在内存中的地址决定。如果两个实例具有相同的内存地址,则它们是相同的。

但是,这可以在对象中重载,以便开发人员可以比较在同一内存位置中的两个对象,并且仍然被视为相等。例如,如果您有一个数据访问层,其中每个对象都有来自数据库的数据记录ID,则可以根据ID比较对象相等性。

您可overload operators生成此功能。