2013-02-11 57 views
1

我有一個IEquatable<T>方法這樣的:IEquatable - 覆蓋equals方法 - 檢查空

public bool Equals(TravelOptions other) 
{ 
    if (other == null) return false; 
    return 
     this.OutTravelType.Equals(other.OutTravelType) & //enum 
     this.BackTravelType.Equals(other.BackTravelType) & //enum 
     this.OutTravelPointID.Equals(other.OutTravelPointID) & //int 
     this.BackTravelPointID.Equals(other.BackTravelPointID) & //int 
     this.OutTerminal.Equals(other.OutTerminal) & //string 
     this.BackTerminal.Equals(other.BackTerminal) & //string 
     this.OutTime.Equals(other.OutTime) & //string :(
     this.BackTime.Equals(other.BackTime) & //string 
     this.Checkin.Equals(other.Checkin) & //int 
     this.OutFree.Equals(other.OutFree) & //bool 
     this.BackFree.Equals(other.BackFree); //bool 
} 

,但我需要做的就是增加一些檢查空在那裏各個位的東西,因爲目前它會拋出一個NullReferenceException 有沒有一些狡猾的做法,所以它不會最終成爲一個討厭的混亂? 外出和返回旅行類型是枚舉,並始終設置,以便首先檢查它們。外面和後面是免費的bools,旅行點是ints,其餘都是字符串。 只是覺得它會變得非常混亂,如果我開始不得不檢查空值,除非有一些速記方法做到這一點?

感謝

回答

2

對於所有這些屬性,只需使用==,而不是調用Equals

return OutTravelType == other.OutTravelType && 
     BackTravelType == other.BackTravelType && 
     ...; 

所有這些類型都可以直接處理(整型,布爾,枚舉)或重載==運營商(string) 。請注意,使用&&而不是&,因爲&&是短路:如果第一個屬性不相等,則檢查其他10個屬性沒有意義。

順便說一句,它看起來像你可以封裝所有的「輸出」特性一起,共同所有的「後退」的屬性,讓你只用:

return OutwardJourney == other.OutwardJourney && 
     ReturnJourney == other.ReturnJourney && 
     Checkin == other.Checkin; // Looks like this isn't part of out/back 

其中Journey將有一個旅遊型,旅行點ID,終端,時間和「免費」(無論如何)。

+0

感謝您的回覆,我以爲我是在用按位進行短路,但我想不是,你能解釋一下爲什麼==工作和Equals(請不要請。謝謝 – nat 2013-02-11 10:05:54

+0

@nat:'=='就像使用兩個參數調用靜態方法一樣,而當調用* instance *方法時,當目標引用爲空時,該方法將失敗。 – 2013-02-11 10:14:25

2

您可以使用string.Equals,處理null值優雅的靜態形式:

string.Equals(this.OutTerminal, other.OutTerminal) 

當然,如果你不打算通過StringComparison此提供的選項僅僅是一樣的,如果與==進行比較。