![](/img/trans.png)
[英]What is the best way to test for object equality - without overriding Equals & GetHashCode, or implementing IEquatable<T>?
[英]IEquatable<T> - Best practice override for .Equals(object obj) in C#
每當我編寫一個可能包含一些數據的新class
或struct
,可能需要進行比較時,我總是實現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
,如果它無法施展,因此它只是檢查this
對null
,沒有拋出異常; 那么拋出異常還是僅返回false
更好?
編輯:正如許多SO專家所指出的那樣,結構不能為null,因此第二種選擇不適用於結構。 因此,另一個問題.Equals(object obj)
在腦海: .Equals(object obj)
的重寫實現對於結構和類是否應該相同?
正如@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.