我有两个类,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
。
private bool SpousesSame(Person p1, Person p2)
{
return p1?.Spouse != null && p1.Spouse == p2?.Spouse;
}
如果p1
或p1.Spouse
为空,则p1?.Spouse
将为空,在这种情况下,将返回false
。
否则,我们知道p1.Spouse
不为空,因此可以将其与 p2?.Spouse
.
使用 Elvis 运算符?.
如下所示:
p1?.Spouse != null && p2?.Spouse != null
p1?.Spouse
如果 p1
为 null,则计算结果为 null
,否则计算结果为 p1.Spouse
。你可以把它链接在一起,所以如果Spouse
上有另一个属性,你可以执行以下操作:
p1?.Spouse?.Name
这将返回配偶的姓名,但前提是p1.Spouse
和p1
都是非空的,以避免空引用异常。
此外,我会在相等性检查的单独 if 块中进行空检查,因为空检查是验证,而相等检查是您的实际逻辑。除非你的方法还有更多,否则你不需要设置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);
}
您可以将代码替换为单个赋值。这应该等效于您的代码,还请注意,您不需要检查属性,因为您已经检查了 p1 和 p2 参数并使用了 &&
运算符:
private bool SpousesSame(Person p1, Person p2)
{
bool tempFlag = p1 != null && p2 != null && p1.Spouse == p2.Spouse;
return tempFlag;
}