0

我很好奇下一种情况下的编译器效率:

double total = list.Sum(x => x.Value) ?? 0;

问:编译器会生成执行 Sum 函数一次或两次的代码吗?

它可以产生类似的东西:

double total = list.Sum(x => x.Value) == null ? 0 : (double)list.Sum(x => x.Value);

或者

double temp = list.Sum(x => x.Value);
total = temp == null ? 0 : (double)temp;
4

3 回答 3

8

您的代码毫无意义,因为即使将所有空值相加也会导致 0。

var d = new int?[]{null,null};
d.Sum().Dump(); //0

...所以Enumerable.Sum()永远不会产生null你试图防范的价值。

于 2013-03-18T11:35:12.480 回答
4

代码将执行Sum一次。这就是在语言中引入新运算符的全部意义所在。您可以通过引入具有副作用的条件并验证副作用仅应用一次来验证这一点:

int? x = 5;
int y = x++ ?? 100;

执行此代码后,xis 6, not 7

于 2013-03-18T11:34:33.820 回答
0

??运算符只适用于可空类型,不是double可空类型,所以这段代码不会编译。同样,.Sum()扩展方法永远不会null在这个列表中返回,它总是会返回0

于 2013-03-18T11:37:11.683 回答