我正在阅读C#7.0变更日志,遇到了一个显示新元组语法的示例。
private static (int Max, int Min) Range(IEnumerable<int> numbers)
{
int min = int.MaxValue;
int max = int.MinValue;
foreach(var n in numbers)
{
min = (n < min) ? n : min;
max = (n > max) ? n : max;
}
return (max, min);
}
我很好奇编译器是否优化了像min = (n < min) ? n : min;
这样的行,因为min = min
操作似乎有点无用。我编译了代码(在发布模式下(,并在ILDASM中打开它,发现min = min
赋值仍然存在。
对于编译器来说,跳过赋值是个难题吗?或者可能是因为多线程问题?
条件运算符的工作方式是始终分配一个值,因为编译器总是希望在"="之后有一个值。当然,编译器可以用来检查左手边和右手边是否相同,当考虑到在大多数情况下不太可能出现min=min的情况时,重写变量(从右到左(在大多数时候都比使用检查来比较两个变量更快,这只会导致额外的检查,并在99.9%的时间内减慢执行速度。
程序员的工作是确定何时使用条件运算符或简单的if
int min = int.MaxValue;
int max = int.MinValue;
foreach(var n in numbers)
{
if(n < min) min = n;
if(n > max) max = n;
}
这样,在这种情况下可以避免min=min赋值。