C#if / else上的编译器优化

时间:2011-11-15 14:19:01

标签: c# .net compiler-construction compiler-optimization

我对编译器没有太多了解,以及.Net如何优化生成的机器代码,但希望了解以下场景:

    class AnyClass
    {
        public bool anyFlag;
        AnyClass()
        {
            anyFlag = true;
        }

        public void Action()        
        {
            if(anyFlag)
                 //Perform Certain Actions
        }
    }

anyFlag在整个程序范围内不会改变。编译器是否会为Action方法生成MIL /机器代码?如果是这样,它会在那里检查吗?

2 个答案:

答案 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反汇编生成的可执行文件来显示此信息。