1

例如,

int i = 0;

i = new Random().Next();

如果new Random().Next();返回0,CLR 会注意到不必要的赋值而不执行该语句,还是该语句仍会执行?

4

1 回答 1

3

无论如何,我们都会执行和分配它。CLR 不会做这种优化。通常 JIT 会进行优化,但在这种情况下不会。

我认为也不会实施这种优化。

如果编译器检查旧值是否等于新值并且跳过会大大降低性能,请考虑您将要执行的所有分配。overridden Equals如果您有并执行一些计算成本高的检查以确定相等性,那将对性能产生更大的影响。这很伤人。不是吗?

一旦我编写了一个基准来查看检查相同的值并忽略分配更好还是盲目地覆盖值更好。结果表明盲目地覆盖该值更好。我现在没有代码,感兴趣的人可以自己尝试并评估结果。

于 2013-09-19T14:50:41.487 回答