繁体   English   中英

为什么C#Object类有两个equals方法

[英]Why C# Object class has two equals method

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

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

Java中 ,只有一个 equals方法。

第一

public virtual bool Equals(object obj);

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

第二

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

每次想要比较objAobjB实例时,你都不会将objAnull进行比较

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);

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

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

第二个equals方法将两个参数相互比较...... :)我们无法覆盖它。

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

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#这样的静态方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM