我遇到了检查外部和内部对象的空引用的场景。外部对象也有可能为null和内部对象。
if (outerObject != null && outerObject.innerObject != null)
{
outerObject.innerObject.DoSomething();
}
如果 中的第二个表达式被评估,那么将抛出 NullRefence Exception 。
我可以选择使用嵌套(如
)if(outerObject != null)
{
if(outerObject.innerObject != null)
{
outerObject.innerObject.DoSomething();
}
}
我只是想知道,即使第一个表达式是假的,第二个表达式是否会被评估?
哪一个最好?
答案 0 :(得分:4)
&&
运算符通过检查第一个运算符/表达式来工作 - 如果计算结果为true,则只考虑第二个运算符/表达式。
所以,你的第一个选择就足够了:
if (outerObject != null && outerObject.innerObject != null)
{
outerObject.innerObject.DoSomething();
}
答案 1 :(得分:4)
C#6.0现在支持?.
Null条件运算符。这意味着你可以改变:
if (outerObject != null && outerObject.innerObject != null)
到
if (outerObject?.innerObject != null)
此外,&&在C#中使用短路评估,它首先检查左/第一个表达式然后(如果是真的)检查正确的表达式。
答案 2 :(得分:3)
在这种情况下,两者都是平等的。有趣的是,编译器可能会将第二个代码转换为第一个样式if
语句。您也可以这样做:
outerObject?.innerObject?.DoSomething();
答案 3 :(得分:2)
条件AND运算符(&&)执行其bool的逻辑AND 操作数,但仅在必要时才计算其第二个操作数。阅读here
如果第一个表达式为false,则永远不会检查第二个表达式!
所以你的第一个选择是好的:
if (outerObject != null && outerObject.innerObject != null)
{
outerObject.innerObject.DoSomething();
}
这也称为short-circuit评估