簡體   English   中英

quaqua <T> -C#中.Equals(object obj)的最佳做法替代

[英]IEquatable<T> - Best practice override for .Equals(object obj) in C#

每當我編寫一個可能包含一些數據的新classstruct ,可能需要進行比較時,我總是實現IEquatable<T>因為這為class/struct提供了強類型的.Equals(T other)方法。

例:

public struct Radius : IEquatable<Radius>
{
    public Int32 TopLeft { get; set; }
    public Int32 TopRight { get; set; }
    public Int32 BottomLeft { get; set; }
    public Int32 BottomRight { get; set; }

    public bool Equals(Radius other)
    {
        return this.TopLeft == other.TopLeft
            && this.TopRight == other.TopRight
            && this.BottomLeft == other.BottomLeft
            && this.BottomRight == other.BottomRight;
    }
}

除了提供.Equals(Radius other)的實現.Equals(Radius other) ,我還應該真的重寫默認實現( .Equals(object obj) )。

我在這里有兩個選擇,我的問題是,這些實現中哪個更好?

選項1是使用強制轉換:

public override bool Equals(object obj)
{
    return this.Equals((Radius)obj);
}

選項2是使用“ as”關鍵字:

public override bool Equals(object obj)
{
    return this.Equals(obj as Radius);
}

我之所以問這個是,利用鑄造將拋出一個異常,如果obj不能轉換為Radius ,而as將解析為null ,如果它無法施展,因此它只是檢查thisnull ,沒有拋出異常; 那么拋出異常還是僅返回false更好?

編輯:正如許多SO專家所指出的那樣,結構不能為null,因此第二種選擇不適用於結構。 因此,另一個問題.Equals(object obj)在腦海: .Equals(object obj)的重寫實現對於結構和類是否應該相同?

Equals()方法絕不能拋出異常

不同類型的對象僅僅是不相等的。

引用文檔

等於的實現不得拋出異常; 他們應該總是返回一個值。 例如,如果obj為null,則Equals方法應返回false而不是拋出ArgumentNullException。

正如@SLaks已經提到的, Equals()永遠不會拋出。

在這種特殊情況下,我認為將is運算符與強制類型轉換結合使用可以幫助您:

public override bool Equals(object obj)
{
     if(obj is Radius)
         return Equals((Radius)obj);

     return false;
}

如果您有一個class ,則應該簡單地使用as運算符:

public override bool Equals(object obj)
{
     return Equals(obj as MyObj);
}

public bool Equals(MyObj obj)
{
     if(ReferenceEquals(obj, null))
         return false;

     // ToDo: further checks for equality.
}

我個人的看法是使用第二個選項,或者甚至事先檢查對象是否為“半徑”,然后返回false,以使意圖更清晰

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM