C#提供了四種不同的函式來判斷兩個物件是否相等:
public static bool ReferenceEquals(object left, object right);
2.
public static bool Equals(object left,object right);
3.
public virtual bool Equals(object right);
4.
public static bool operator== (MyClass object,MyClass right);
前兩個靜態方法我們永遠都不應該去重新定義,後兩個則可視需要去重新定義。
以ReferenceEquals來說,其功能為判斷兩個變數指標是否指向同一物件。也就是判斷兩者的物件參考是否相同。如果兩個指標所指的是同一物件的話,則該方法會返回True值。反之,則傳回False。若是以值類別來看,以ReferenceEquals來比較兩個值類別。或是將一個值類別與自身進行比較。其值皆為False。
Object.Equals靜態方法則是當我們不知道執行階段類型時,所採用的判斷相等的方法。其實現概念如下:
public static bool Equals(object left, object right)
{
if (left == right)
return true;
if ((left == null) || (right == null))
return false;
return left.Equals(right);
}
從上述代碼可以看出,Object.Equals靜態方法是透過叫用left參數的Equals方法所實現的。
至於非靜態的Object.Equals方法,當預設的處理方式與我們所預期的不同,可以視需求重新定義它。像是値類型在預設的情況下,其Equals方法是叫用基底類別ValueType.Equals來處理的。其判斷的動作是在不知道類別成員的狀態下去做的。因此,它是利用.NET的反射機制來達到對應的效果,在效能上並不是很好。所以當建立值類別時,我們都應重新定義ValueType.Equals方法。又或者說,當參考類別不想採用物件參考來判斷是否相等,想改用值類型的判斷方式時,我們也可以重新定義Object.Equals方法。
而Operator==()方法,則是當我們建立值類別時,就應該重新定義。其理由跟上面重新定義ValueType.Equals方法的一樣。