空合并运算符后表达式的性能
本文关键字:性能 表达式 合并 运算符 | 更新日期: 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。