我正在阅读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;
除了客户只评估一次。
有人可以详细说明“评估一次”(我假设)两次评估吗?
答案 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
。