我有两个类Person
和Spouse
,这个方法检查配偶之间是否相等:
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
。
答案 0 :(得分:8)
private bool SpousesSame(Person p1, Person p2)
{
return p1?.Spouse != null && p1.Spouse == p2?.Spouse;
}
如果p1?.Spouse
或p1
为空,则 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.Spouse
和p1
都为非空时才能避免空引用异常。
此外,我会在单独的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;
}