给未来访问者的注意:这个问题是基于错误的复制代码。?.算子确实是短路的。现在可以关闭此浏览器选项卡。
在网络上有许多来源声称零条件运算符(?.)短路(例如http://www.informit.com/articles/article.aspx?p=2421572,搜索“电路”)。我无法察觉到任何这样的事情:
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声称情况就是这样,但代码示例没有演示短路:
//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开发周期中,这种行为是否曾经改变过?这就解释了网络上的坏消息来源。,为什么有那么多关于短路的讨论,如果不存在的话?,我可能误解了一些东西。
发布于 2016-06-24 16:34:55
它会短路(如果我们的意思是“终止呼叫链”).
请考虑以下代码:
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;
}
}
}运行它,它就会打印
Inner called.
Inner called.
Inner called.现在将return this;更改为return null;,它将打印
Inner called.从而证明调用链在第一个null处停止。
现在将表达式更改为:
var x = c?.Inner?.Inner.Inner;它还会打印出来
Inner called.因为它短路了。
显然,它必须至少访问Inner一次,以查看它是否为null。如果c本身为null,那么根本就不会访问Inner。
请注意,给定该表达式:
变量x= c?.Inner.Inner;
在第一次使用.Inner时,它将给出一个空引用异常,因为它已经检查过c使用c?时是否为null,现在它继续使用.Inner。
如果c为null,它就根本不会访问.Inner,因为c?.。
发布于 2016-06-24 16:32:45
这里的短路意味着,例如,当您有obj?.Property1?.Property2?.Property3和obj是null时,整个表达式返回null,并且没有调用其他属性(因为它们将抛出)。
这个短路可以发生在每个?.上,这取决于哪个部分是null。如果obj不是null,并且第一个Property是空的,那么只有其他两个不会被调用。第二种情况也是如此,等等。
短路的是表达式,而不是该表达式之后的其余语句。
发布于 2016-06-24 17:36:09
简单地说,短路是一种保证,如果它确定一个属性为null,那么它将不再试图计算其余的属性。
使用一个不涉及空操作符的示例可能会更清楚。
在下面的示例中,我们在检查其属性值之前先检查x是否为null。
if(x != null & x.SomeProperty == 1)但是,如果x为null,这仍然会引发异常,因为它将计算这两种情况。即使x为null,它仍然会尝试检查x.SomeProperty并抛出一个NullReferenceException。
但是如果我们用&&运算符代替
if(x != null && x.SomeProperty == 1)然后是“短路”如果第一个条件不是真,那么它甚至不会计算第二个条件。这是在检查它们是否都是真的。但是,如果第一个不是真的,那么它们都不可能都是真的--第二个的价值并不重要。所以在第一个条件之后它就停止了。
短路最终意味着,如果它对任何使剩余条件不相关的内容进行评估,则保证不对剩余条件进行评估。
https://stackoverflow.com/questions/38018083
复制相似问题