Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 空合并运算符后表达式的性能_C#_.net - Fatal编程技术网

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

C# 空合并运算符后表达式的性能,c#,.net,C#,.net,我有下一个表达: 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; 如果(max==null) { max=items.FirstOrDefault(

我有下一个表达:

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;
如果(max==null)
{
max=items.FirstOrDefault(x=>x.Key
我想这样缩短它:

var max = 
    items.FirstOrDefault(x => x.Key > date).Value ?? // this line
    items.FirstOrDefault(x => x.Key < date).Value;   
var max=
items.FirstOrDefault(x=>x.Key>date).值???//这条线
items.FirstOrDefault(x=>x.Key
这里有一个问题: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;
var max=
items.FirstOrDefault(x=>x.Key>date)。值==null?
items.FirstOrDefault(x=>x.Key>date)。值:
items.FirstOrDefault(x=>x.Key
您的术语已关闭。
??
运算符是空合并运算符。三元运算符实际上是第二个条件运算符:
condition?表达式1:expression2

空合并运算符未编译为三元条件表达式。它被明确指定为短路运算符

根据C#规范:

形式为A?的空合并表达式??b要求a为可空类型或引用类型。如果a为非空,则a的结果为??b是a;否则,结果为b。该操作仅在a为null时计算b

相比之下,示例中的条件运算符可能会执行两次“大于”查询。如下所述:

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


你的术语错了。
??
运算符是空合并运算符。三元运算符实际上是第二个条件运算符:
condition?表达式1:expression2

空合并运算符未编译为三元条件表达式。它被明确指定为短路运算符

根据C#规范:

形式为A?的空合并表达式??b要求a为可空类型或引用类型。如果a为非空,则a的结果为??b是a;否则,结果为b。该操作仅在a为null时计算b

相比之下,示例中的条件运算符可能会执行两次“大于”查询。如下所述:

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


你的术语错了。
??
运算符是空合并运算符。三元运算符实际上是第二个条件运算符:
condition?表达式1:expression2

空合并运算符未编译为三元条件表达式。它被明确指定为短路运算符

根据C#规范:

形式为A?的空合并表达式??b要求a为可空类型或引用类型。如果a为非空,则a的结果为??b是a;否则,结果为b。该操作仅在a为null时计算b

相比之下,示例中的条件运算符可能会执行两次“大于”查询。如下所述:

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


你的术语错了。
??
运算符是空合并运算符。三元运算符实际上是第二个条件运算符:
condition?表达式1:expression2

空合并运算符未编译为三元条件表达式。它被明确指定为短路运算符

根据C#规范:

形式为A?的空合并表达式??b要求a为可空类型或引用类型。如果a为非空,则a的结果为??b是a;否则,结果为b。该操作仅在a为null时计算b

相比之下,示例中的条件运算符可能会执行两次“大于”查询。如下所述:

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



为什么要缩短它?它损害了可读性,在这种情况下甚至可能引入未知行为。随着c#被编译,它是否有点冗长无关紧要,因此我认为没有理由脱离编写的代码。这是一个微观优化,最终只会浪费时间寻找这种类型的代码进行“优化”,或者在以后对这种行为进行故障排除。@Travis:Resharper让我这么做的。。。我必须这样做,它迫使我在IF:)下显示丑陋的下划线。请看phoog的答案。您的第二个示例是正确的,它没有编译到third@TravisJ:我不同意,与第一个代码相比,-运算符更具可读性和详细性。实际上我建议把??在换行符上(如?和:在三元运算符中)。@crazy_crank-你知道详细的意思,对吧?为什么要缩短它?它损害了可读性,在这种情况下甚至可能引入未知行为。作为c#i