逻辑AND(&&)在c#中是如何工作的?

时间:2016-05-19 07:36:17

标签: c# performance logical-operators

我遇到了检查外部和内部对象的空引用的场景。外部对象也有可能为null和内部对象。

 if (outerObject != null && outerObject.innerObject != null)
 {
    outerObject.innerObject.DoSomething();
 }

如果 中的第二个表达式被评估,那么将抛出 NullRefence Exception

我可以选择使用嵌套(如

if(outerObject != null)
{
    if(outerObject.innerObject != null)
    {
        outerObject.innerObject.DoSomething();
    }
}

我只是想知道,即使第一个表达式是假的,第二个表达式是否会被评估?

哪一个最好?

4 个答案:

答案 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评估