首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是“空条件运算符短路”?

什么是“空条件运算符短路”?
EN

Stack Overflow用户
提问于 2016-06-24 16:27:49
回答 3查看 1.5K关注 0票数 0

给未来访问者的注意:这个问题是基于错误的复制代码。?.算子确实是短路的。现在可以关闭此浏览器选项卡。

在网络上有许多来源声称零条件运算符(?.)短路(例如http://www.informit.com/articles/article.aspx?p=2421572,搜索“电路”)。我无法察觉到任何这样的事情:

代码语言:javascript
复制
    static void Main()
    {
        var c = new C();

        Console.WriteLine(c?.Inner?.Inner); //does not rely on short circuiting, works
        Console.WriteLine(c?.Inner.Inner); //throws NullReferenceException
    }

    class C
    {
        public C Inner;
    }

在这里,第一行的工作是因为第二个?.。第二个?.将null视为其第一个操作数,因此也返回null。这不是短路。

显然,即使触发了null情况,链的其余部分也会执行。链子没有中止。对我来说,短路意味着链被中止。MSDN声称情况就是这样,但代码示例没有演示短路:

代码语言:javascript
复制
//The last example demonstrates that the null-condition operators are short-circuiting
int? count = customers?[0]?.Orders?.Count();
// null if customers, the first customer, or Orders is null

在C# 6开发周期中,这种行为是否曾经改变过?这就解释了网络上的坏消息来源。,为什么有那么多关于短路的讨论,如果不存在的话?,我可能误解了一些东西。

不是重复的,因为它是关于操作者是否短路(答案:否,虽然公认的答案没有那样说)。这位候选人是关于可空布尔和其他无关的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-06-24 16:34:55

它会短路(如果我们的意思是“终止呼叫链”).

请考虑以下代码:

代码语言:javascript
复制
using System;

namespace ConsoleApplication1
{
    class C
    {
        public C Inner
        {
            get
            {
                Console.WriteLine("Inner called.");
                return this; // Change this to `return null;`
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var c = new C();

            var x = c?.Inner?.Inner?.Inner;
        }
    }
}

运行它,它就会打印

代码语言:javascript
复制
Inner called.
Inner called.
Inner called.

现在将return this;更改为return null;,它将打印

代码语言:javascript
复制
Inner called.

从而证明调用链在第一个null处停止。

现在将表达式更改为:

代码语言:javascript
复制
var x = c?.Inner?.Inner.Inner;

它还会打印出来

代码语言:javascript
复制
Inner called.

因为它短路了。

显然,它必须至少访问Inner一次,以查看它是否为null。如果c本身为null,那么根本就不会访问Inner

请注意,给定该表达式:

变量x= c?.Inner.Inner;

在第一次使用.Inner时,它将给出一个空引用异常,因为它已经检查过c使用c?时是否为null,现在它继续使用.Inner

如果c为null,它就根本不会访问.Inner,因为c?.

票数 6
EN

Stack Overflow用户

发布于 2016-06-24 16:32:45

这里的短路意味着,例如,当您有obj?.Property1?.Property2?.Property3objnull时,整个表达式返回null,并且没有调用其他属性(因为它们将抛出)。

这个短路可以发生在每个?.上,这取决于哪个部分是null。如果obj不是null,并且第一个Property是空的,那么只有其他两个不会被调用。第二种情况也是如此,等等。

短路的是表达式,而不是该表达式之后的其余语句。

票数 2
EN

Stack Overflow用户

发布于 2016-06-24 17:36:09

简单地说,短路是一种保证,如果它确定一个属性为null,那么它将不再试图计算其余的属性。

使用一个不涉及空操作符的示例可能会更清楚。

在下面的示例中,我们在检查其属性值之前先检查x是否为null。

代码语言:javascript
复制
if(x != null & x.SomeProperty == 1)

但是,如果x为null,这仍然会引发异常,因为它将计算这两种情况。即使x为null,它仍然会尝试检查x.SomeProperty并抛出一个NullReferenceException

但是如果我们用&&运算符代替

代码语言:javascript
复制
if(x != null && x.SomeProperty == 1)

然后是“短路”如果第一个条件不是真,那么它甚至不会计算第二个条件。这是在检查它们是否都是真的。但是,如果第一个不是真的,那么它们都不可能都是真的--第二个的价值并不重要。所以在第一个条件之后它就停止了。

短路最终意味着,如果它对任何使剩余条件不相关的内容进行评估,则保证不对剩余条件进行评估。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38018083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档