【问题标题】:IEquatable - Overriding Equals - checking for nullsIEquatable - 覆盖 Equals - 检查空值
【发布时间】:2013-02-11 18:06:52
【问题描述】:

因此我有一个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
}

但我需要做的是为其中的各种位添加一些空值检查,因为目前它会抛出一个 nullreferenceexception 有没有一些巧妙的方法可以做到这一点,所以它最终不会变成一团糟? 往返旅行类型是枚举,并且始终设置为先检查它们。 out 和 back free 是布尔值,旅行点是整数,其余都是字符串。 只是觉得如果我开始必须检查空值会变得非常混乱,除非有一些速记方法吗?

谢谢

【问题讨论】:

    标签: c# nullreferenceexception iequatable


    【解决方案1】:

    对于所有这些属性,只需使用== 而不是调用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、终点站、时间和“免费”(无论是什么意思)。

    【讨论】:

    • 感谢您的回复,我以为我正在使用按位 & 进行短路,但我猜不是,您能否解释一下为什么 == 有效而 Equals( 请不要。谢谢
    • @nat: == 就像调用带有两个参数的静态方法一样,而当您调用 instance 方法时,目标引用为空时会失败。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-08-09
      • 2019-05-19
      • 2014-12-31
      • 2016-12-19
      • 2016-04-24
      • 2014-05-27
      • 1970-01-01
      • 2014-04-20
      • 1970-01-01
      相关资源
      最近更新 更多