每當我寫一個新的class
或struct
很可能保存一些數據,可能需要進行比較,我始終貫徹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礦石只檢查this
與null
,沒有拋出異常;那麼拋出異常還是隻返回false
?
編輯:由於它已經被很多同胞指出了,結構不能爲空,因此第二個選項不適用於結構。因此還有另一個問題值得我們思考:.Equals(object obj)
的重寫實現應該對結構體和類是相同的嗎?
如果'other'爲null,那麼'Equals(Radius)'方法應該返回false,否則它會拋出一個空輸入的異常。 – cdhowie
@cdhowie這是一個結構體,它不能爲空。 – Servy
您不能使用'as'關鍵字,因爲'Radius'不是可以爲空的類型。你應該使用'is'來爲其他類型返回false,然後才能投射。 – Servy