空条件运算符仅评估一次

时间:2016-07-20 02:36:30

标签: c#

我正在阅读C#6.0中引入的Null Conditional运算符,但我并不完全理解它。

来自https://github.com/dotnet/roslyn/wiki/New-Language-Features-in-C%23-6

int? first = customers?[0].Orders.Count();

这个例子基本上等同于:

int? first = (customers != null) ? customers[0].Orders.Count() : null;

除了客户只评估一次。

有人可以详细说明“评估一次”(我假设)两次评估吗?

2 个答案:

答案 0 :(得分:1)

这意味着程序只访问customers一次。在第二个示例中,customers被访问两次,第一次用于空检查,第二次用于Orders属性,如果它是非空的。

在新功能中,customers只能访问一次,如果它不为空,则无法再次访问(例如,它不可能被访问)如果某些东西修改了字段,则变为null)并且将使用已经访问过的对象。

答案 1 :(得分:1)

这是与你的第一个陈述

更好的等价物
var temp = customers;
int? first;
if(temp != null)
{
    first = temp[0].Orders.Count();
}
else
{
    first = null;
}

变量customers仅被触及"一旦。当customers是在get中执行某些操作或属于函数的属性时,这一点更为重要。

private int accessCount = 0;
private Customers[] _customers;
private Customers[] customers 
{
    get
    {
        accessCount++;
        return _customers;
    }
    set
    {
        _customers = value;
    }
}

在你的第二个例子中,customers属性必须被触及"两次,一次用于索引器的空检查,为accessCount提供值2