我对编译器以及.Net如何优化生成的机器代码没有太多了解,但想了解以下场景:
class AnyClass
{
public bool anyFlag;
AnyClass()
{
anyFlag = true;
}
public void Action()
{
if(anyFlag)
//Perform Certain Actions
}
}
anyFlag 在整个程序范围内不会改变。编译器会为 Action 方法生成 MIL/机器代码吗?如果是的话,它会有 if 检查吗?
在您的情况下,编译器不会过滤 if 语句,因为您的 anyFlag 是公共的(因此可以从多个位置更改它),并且因为该值仅在构造函数中设置,所以编译器现在也不会在运行时之前设置该值.
以下代码可以满足您的要求:
static void MyFunc()
{
const bool flag = true;
string s = null;
if (flag)
{
s = "a";
}
else
{
s = "b";
}
}
如果您在 Visual Studio 中插入此代码,您将看到生成的警告,指出 s="b";永远不会达到,并且此代码将被优化掉。
是的,编译器会生成IL。由于您稍后可以使用反射或 Emit 来调用该方法或更改
anyFlag
的值,因此它会保留它。您可以通过使用 Visual Studio 附带的 ildasm 反汇编生成的可执行文件来展示这一点。