C# if/else 的编译器优化

问题描述 投票:0回答:2

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

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

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

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

c# .net compiler-optimization
2个回答
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
投票

是的,编译器会生成IL。由于您稍后可以使用反射或 Emit 来调用该方法或更改

anyFlag
的值,因此它会保留它。您可以通过使用 Visual Studio 附带的 ildasm 反汇编生成的可执行文件来展示这一点。

© www.soinside.com 2019 - 2024. All rights reserved.