【发布时间】:2021-04-01 21:51:45
【问题描述】:
当我有一个只读变量时:
public readonly bool myVar = true;
并在这样的代码中检查它:
for(int i = 0; i != 10; i++)
{
if(myVar)
DoStuff();
else
DoOtherStuff();
}
查看发出的 IL,我可以看到检查是在循环的每次迭代中执行的。我希望上面的代码产生与此相同的 IL:
if (myVar)
{
for(int i = 0; i != 10; i++)
{
DoStuff();
}
}
else
{
for(int i = 0; i != 10; i++)
{
DoOtherStuff();
}
}
那么为什么不对循环外部的检查进行优化,因为该字段是只读的并且不能在迭代之间更改?
【问题讨论】:
-
因为
readonly只是一个编译时规则。它实际上并没有保证任何东西。见重复。优化不得违反法律法规,无论多么不明智。 -
另请注意,检查生成的 CIL 并没有真正显示任何内容。生成的本机代码才是最重要的,我很确定我已经看到了这种优化。