iT邦幫忙

DAY 9
1

.NET程式效能Issue系列 第 9

[Day 9][C#]Effective C# 條款九: 理解幾個相等判斷之間的關係

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方法的一樣。


上一篇
[Day 8][C#]Effective C# 條款八: 確保0為值類型的有效狀態
下一篇
[Day 10][C#]Effective C# 條款十: 理解GetHashCode()方法的缺陷
系列文
.NET程式效能Issue11
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言