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