2016-12-05 64 views
2

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

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

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

+0

@MickyD我也读过文档,但两者之间并没有太大的区别。 –

+2

http://stackoverflow.com/questions/1451454/c-how-does-the-static-object-equals-check-for-equality - 这不是完全重复的,但应该给你正确的方向。 – Dennis

+0

因为您可能想要比较可以为空的两个值。你会得到'A.Equals(B)'的异常,其中A为空。所以你可以使用'object.Equals(A,B)' – elshev

回答

7

首先

public virtual bool Equals(object obj); 

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

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

是一种糖,你不去比较objAnull每t IME要比较objAobjB实例

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, notice Objects instead of Object 
Objects.equals(Object a, Object b); 
0

第一个比较当前实例和参数中提供的实例。后来比较A和B中的一个静态方法

0

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

第二个equals方法将两个参数相互比较...... :)我们不能重写它。

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

+0

当你说你不能直接覆盖第二个方法...但是它在执行空比较之后调用第一个方法,所以它不像你不能影响它的行为... –

+0

正确的,我的声明是真实的,当我们想在空检查之前改变行为的时候.. –

+0

但是它在每一种情况下都是误导性的 - 而作为Equals的契约是它的意思是对称的,你非常难以改变nullity的处理方式。 –

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

相关问题