2013-02-11 62 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此提供的选项仅仅是一样的,如果与==进行比较。