IEquatable-重写Equals-检查是否为null

本文关键字:null 是否 检查 重写 Equals- IEquatable- | 更新日期: 2023-09-27 17:58:43

我有一个IEquatable<T>方法,因此:

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
}

但我需要做的是为其中的各种位添加一些对null的检查,因为目前它将抛出一个nullreferenceexception有没有什么巧妙的方法可以做到这一点,这样它就不会变成一团乱麻?往返行程类型是枚举,并且总是设置为先检查这些类型。界外球和界外球都是bool,旅行点都是int,剩下的都是字符串。只是觉得如果我开始检查null会变得非常混乱,除非有一些简写的方法?

感谢

IEquatable-重写Equals-检查是否为null

对于所有属性,只需使用==而不是调用Equals:

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

所有这些类型要么直接处理(int、bool、enum),要么具有重载的==运算符(string)。请注意使用&&而不是&,因为&&是短路:如果第一个属性比较不相等,则检查其他10个属性没有意义。

顺便说一句,看起来您可以将所有"Out"属性封装在一起,将所有"Back"属性封装到一起,只剩下:

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

其中Journey将具有旅行类型、旅行点ID、终点站、时间和"免费"(无论这意味着什么)。

您可以使用静态形式的string.Equals来优雅地处理null值:

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

当然,如果您不打算通过StringComparison提供选项,这与==相比是一样的。