2013-08-07 50 views
4

每當我寫一個新的classstruct很可能保存一些數據,可能需要進行比較,我始終貫徹IEquatable<T>,因爲這提供了class/struct用強類型.Equals(T other)方法。IEquatable <T> - 最佳實踐覆蓋在C#中.Equals(obj對象)

例如:

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(object obj)

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

選項1是採用鑄造:

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

方案2是使用 「爲」 關鍵詞:

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

我之所以問這個是,利用鑄造將如果obj無法投射到Radius,而as將解析爲null(如果無法投射),則拋出異常,theref礦石只檢查thisnull,沒有拋出異常;那麼拋出異常還是隻返回false

編輯:由於它已經被很多同胞指出了,結構不能爲空,因此第二個選項不適用於結構。因此還有另一個問題值得我們思考:.Equals(object obj)的重寫實現應該對結構體和類是相同的嗎?

+1

如果'other'爲null,那麼'Equals(Radius)'方法應該返回false,否則它會拋出一個空輸入的異常。 – cdhowie

+0

@cdhowie這是一個結構體,它不能爲空。 – Servy

+0

您不能使用'as'關鍵字,因爲'Radius'不是可以爲空的類型。你應該使用'is'來爲其他類型返回false,然後才能投射。 – Servy

回答

7

Equals()方法must never throw an exception

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

引述documentation

的Equals必須不引發異常的

實現;他們應該總是返回一個值。例如,如果obj爲null,則Equals方法應返回false而不是拋出ArgumentNullException。

+0

「不同類型的對象」 - 或者根本沒有對象('null')。 – cdhowie

+0

除非您調用Equals的對象爲null –

+1

@chriswarner:在這種情況下,在輸入'Equals()'之前拋出異常。 – SLaks

-1

我個人的看法是前手使用第二個選項,甚至檢查對象爲「半徑」,然後返回false,以便作爲@SLaks已經提到的意圖更加清晰

2

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. 
} 
+0

謝謝,這給了我一個非常清晰,簡明的例子,說明我應該如何實施。 – series0ne