简化空检查和相等

时间:2017-10-25 08:14:21

标签: c# null

我有两个类PersonSpouse,这个方法检查配偶之间是否相等:

private bool SpousesSame(Person p1, Person p2)
{
    bool tempFlag = false;

    if (p1 != null && p2 != null && p1.Spouse != null && p2.Spouse != null && p1.Spouse == p2.Spouse)
    {
        tempFlag = true;
    }

    return tempFlag;
}

正如您所看到的那样,有大量的空检查(Person也可以是null)。 这可以简化吗?

编辑: 当两个人都为空时,我正试图返回false

3 个答案:

答案 0 :(得分:8)

private bool SpousesSame(Person p1, Person p2)
{
    return p1?.Spouse != null && p1.Spouse == p2?.Spouse;
}
如果p1?.Spousep1为空,则

p1.Spouse将为空,在这种情况下将返回false

否则,我们知道p1.Spouse不为空,因此可以将其与p2?.Spouse进行比较。

答案 1 :(得分:2)

使用Elvis运算符?.,如下所示:

p1?.Spouse != null && p2?.Spouse != null
如果p1?.Spouse为空,则

null评估为p1,否则评估为p1.Spouse。您可以将它们链接在一起,因此如果Spouse上有另一个属性,您可以执行以下操作:

p1?.Spouse?.Name

这将返回配偶的名称,但仅当p1.Spousep1都为非空时才能避免空引用异常。

此外,我会在单独的if-block中对您的等式检查执行空值检查,因为空检查是验证,而等式检查是您的实际逻辑。除非你的方法更多,你不需要设置tempFlag,你可以直接返回bool,所以你的方法可以简化为:

private bool SpousesSame(Person p1, Person p2)
{
    //return false if either person or their spouse is null
    if (p1?.Spouse == null || p2?.Spouse == null)
    {
        return false;
    }

    return (p1.Spouse == p2.Spouse);
}

答案 2 :(得分:1)

您可以使用单个分配替换代码。这应该等同于您的代码,同时请注意,您不需要检查属性,因为您已经检查了p1和p2参数并使用了&&运算符:

private bool SpousesSame(Person p1, Person p2)
{
     bool tempFlag = p1 != null && p2 != null && p1.Spouse == p2.Spouse;    
     return tempFlag;
}