我正在阅读C#7.0更新日志,并遇到了一个显示新元组语法的示例。
layoutIfNeeded
我很好奇编译器是否优化了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;
操作似乎没有用。我编译了代码(在发布模式下),并在ILDASM中将其打开,然后看到min = min
分配仍然存在。
对于编译器而言,跳过分配任务是个棘手的问题吗?还是因为某些多线程问题?
答案 0 :(得分:5)
条件运算符的工作方式是始终分配一个值,因为编译器将始终期望在'='之后的值。当然,可以编写编译器来检查左侧和右侧是否相同,在大多数情况下,重写变量(从右到左)比使用检查比较两个变量的速度要快得多。在大多数情况下,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分配。