2016-12-05 68 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#這樣的靜態方法。

相關問題