【问题标题】:Why C# Object class has two equals method为什么 C# Object 类有两个 equals 方法
【发布时间】:2016-12-05 07:08:31
【问题描述】:

作为C#的新手想知道为什么C#的Object类有两个Equals方法和下面的签名。

public virtual bool Equals(object obj);
public static bool Equals(object objA, object objB);

而在 Java 中只有 一个 equals 方法。

【问题讨论】:

  • @MickyD 我也阅读了文档,但两者之间并没有太大区别。
  • stackoverflow.com/questions/1451454/… - 这不是完全重复,但应该给你正确的方向。
  • 因为您可能想要比较两个可以为空的值。 A.Equals(B) 出现异常,其中 A 为空。所以你可以使用object.Equals(A, B)

标签: java c# oop


【解决方案1】:

第一个

public virtual bool Equals(object obj);

是比较对象的标准,典型等方法:如果this等于obj类似于Java的

第二

public static bool Equals(object objA, object objB); 

是一种糖,你不要每次都比较objAnullobjAobjB实例

https://referencesource.microsoft.com/#mscorlib/system/object.cs,f2a579c50b414717

public static bool Equals(Object objA, Object objB) 
{
    if (objA==objB) {
        return true;
    }
    if (objA==null || objB==null) {
        return false;
    }
    return objA.Equals(objB);
}

Java确实有类似的方法:

https://docs.oracle.com/javase/7/docs/api/java/util/Objects.html#equals(java.lang.Object,%20java.lang.Object)

// Please, note Objects instead of Object
Objects.equals(Object a, Object b);

【讨论】:

    【解决方案2】:

    第一个将当前实例与参数中提供的实例进行比较。后者将 A 与 B 作为其静态方法进行比较

    【讨论】:

      【解决方案3】:

      第一个“Equals”方法将调用者对象与参数进行比较...... CallerObject.Equals(targetComparerObject), 此外,我们还可以在子类中为该方法定义自定义覆盖。

      第二个 equals 方法比较两个参数... :) 我们不能覆盖它。

      此外,在 Java 中,equals 方法只比较内存位置。这意味着当我们说 obj1.equals(obj2),默认情况下它只比较引用,无论它们是否指向相同的位置...... 如果我们想要任何自定义比较,我们需要在 JAVA 中覆盖它..

      【讨论】:

      • 当你说你不能覆盖第二种方法时......不是直接,而是在执行空比较后调用第一种方法,所以你不能影响它的行为......
      • 正确,我的说法是正确的,以防我们想在空检查之前改变行为..
      • 但在其他所有情况下都具有误导性 - 由于 Equals 的合同是对称的,因此您确实想要更改无效性的方式非常罕见已处理。
      【解决方案4】:
      public virtual bool Equals(object obj)
      

      这是一个在每个类对象中都可用的对象方法。您可以使用此方法将当前对象与作为参数传递的对象进行比较。

      public static bool Equals(object objA, object objB)
      

      这是Object 类中可用的类方法,它是C# 中所有其他类的最顶层父类,这意味着C# 中的每个类都派生自基类Object .它可以作为静态使用,要求您将两个对象作为参数传递以进行比较。

      有关更多信息和示例,您可以参考文档。

      Object.Equals(obj1, obj2)
      

      https://msdn.microsoft.com/en-us/library/w4hkze5k(v=vs.110).aspx

      obj1.Equals(obj2)
      

      https://msdn.microsoft.com/en-us/library/bsc2ak47(v=vs.110).aspx

      在这种情况下,我看不出 C# 和 Java 之间有什么区别。两者都进行对象比较。这只是关于语言实现。 C# 以两种方式实现它,Java 以自己的方式将其定义为对象方法,而不是像 C# 那样使用静态方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-02
        • 1970-01-01
        • 2013-11-13
        • 1970-01-01
        • 2014-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多