24

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

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

我猜前两个可能是等价的,但我真的不知道。

它的真正作用是什么?

4

2 回答 2

45

基本上它做了三件事:

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

如果两个值都具有良好的相等实现,则排序应该x.Equals(y)无关紧要,因为应该实现相等,这意味着y.Equals(x). 但是,我安装的离线文档确实声明了 first.Equals(second) (或 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.
}
于 2009-09-20T17:02:38.563 回答
1

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

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

您可以重载运算符以产生此功能。

于 2009-09-20T17:06:03.003 回答