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

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

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

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

它到底是做什么的?

基本上它做了三件事:

  • 检查引用相等性(如果是,则返回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. } 

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

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

您可以重载运算符以生成此function。