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

Azi*_*ziz 3 .net c# compiler-construction compiler-optimization

我不太了解编译器以及.Net如何优化生成的机器代码,但想了解以下场景:

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

        public void Action()        
        {
            if(anyFlag)
                 //Perform Certain Actions
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

Wou*_*ort 7

在您的情况下,编译器不会过滤if语句,因为您的anyFlag是公共的(因此可以从多个位置更改),并且因为该值仅在构造函数中设置,所以编译器在运行时也不会显示此值.

以下代码执行您想要的操作:

static void MyFunc()
{
    const bool flag = true;

    string s = null;
    if (flag)
    {
        s = "a";
    }
    else
    {
        s = "b";
    }
}
Run Code Online (Sandbox Code Playgroud)

如果在Visual Studio中插入此代码,您将看到生成的警告,指出s ="b"; 永远不会到达,这个代码将被优化.