2009-03-06 27 views
5

重載比較運算,如何比較,如果兩個變量指向同一個對象(即沒有值)重載operator ==後,如果兩個變量指向同一個對象,如何比較?

public static bool operator ==(Landscape a, Landscape b) 
{ 
    return a.Width == b.Width && a.Height == b.Height; 
} 

public static bool operator !=(Landscape a, Landscape b) 
{ 
    return !(a.Width == b.Width && a.Height == b.Height); 
} 
+1

我儘量避免重載這些運算符的引用類型,因爲大多數人會期望==來測試對象的相等性。 – 2009-03-06 07:05:08

回答

8

使用Object.ReferenceEquals靜態方法。

當然,爲了使==和!=方法保留其全部功能,您還應該重寫Equals和GetHashCode,以便它們爲呼叫者返回一組一致的響應。

4
+0

`ReferenceEquals(object,object)`是Object類的一個靜態方法,除非你爲它寫了一個擴展方法,否則它不能像那樣使用。要使用它,必須調用:`object.ReferenceEquals(a,b)` – 2012-09-24 07:03:04

4

檢查是否指向同一個對象。你應該使用Object.ReferenceEquals方法。如果兩者相同或兩者都爲空,它將返回true。否則它將返回false

0

我知道它的一個老問題,但是如果要重載==或Object.Equals方法,還應該重載反向運算符!=。

而在這種情況下,由於您正在比較內部數字,因此應該重載其他比較運算符<,>,< =,> =。

將來消費你的類的人,無論是第三方消費者,還是接管你的代碼的開發者,都可能使用CodeRush或Refactor之類的東西,它會自動「翻轉」邏輯(也稱爲倒轉有條件的),然後將其扁平化,打破25嵌套的if綜合徵。如果他們的代碼這樣做,並且你重載了==運算符而不會重載!=運算符,它可能會改變你的代碼的意圖。