例如,
int i = 0;
i = new Random().Next();
如果new Random().Next();
返回0
,CLR会注意到不必要的赋值而不执行该语句,或者该语句是否仍会执行?
答案 0 :(得分:3)
无论如何我们会执行和分配。 CLR不会进行这种优化。通常JIT会进行优化,但在这种情况下不会。
我认为这种优化也不会实现。
如果编译器检查旧值是否等于新值并且跳过会严重降低性能,请考虑要执行的所有分配。如果您有overridden
Equals
,那么这会对性能产生更大影响,并且会进行一些计算成本高昂的检查以确定相等性。这很伤人。不是吗?
一旦我编写了一个基准测试,看看是否检查相同的值并忽略赋值更好或盲目地覆盖该值。结果说盲目地覆盖价值。我现在没有感兴趣的代码,人们可以尝试自己并评估结果。