空合并运算符后表达式的性能

本文关键字:性能 表达式 合并 运算符 | 更新日期: 2023-09-27 17:51:07

我有下一个表达式:

var max = items.FirstOrDefault(x => x.Key > date).Value;
if (max == null)
{
    max = items.FirstOrDefault(x => x.Key < date).Value;
}

我想这样缩短它:

var max = 
    items.FirstOrDefault(x => x.Key > date).Value ?? // this line
    items.FirstOrDefault(x => x.Key < date).Value;   

这里是问题: c#是否足够聪明,不会在三元运算符之前执行两次行?

换句话说,我希望三元操作符不会被转换成这样:

var max = 
    items.FirstOrDefault(x => x.Key > date).Value == null ?
    items.FirstOrDefault(x => x.Key > date).Value : 
    items.FirstOrDefault(x => x.Key < date).Value;

空合并运算符后表达式的性能

您的术语不正确。??运算符是空合并运算符。三元运算符实际上是第二个,条件运算符:condition ? expression1 : expression2

空合并操作符不编译为三元条件表达式。它被显式指定为短路操作符。

来自c#规范:

形式为A ??的空合并表达式B要求a为可空类型或引用类型。如果a非空,a的结果??B是a;

如果a为空,则返回b。

相反,在您的示例中,条件运算符冒着执行两次"大于"查询的风险。它的描述如下:

形式为b ?x: y首先计算条件b。然后,如果b为真,则计算x并成为操作的结果。否则,y被求值并成为操作的结果。条件表达式从不同时求值x和y。