Оптимизация компилятора на C # если / еще - PullRequest
3 голосов
/ 15 ноября 2011

Я не слишком разбираюсь в компиляторах и в том, как .Net оптимизирует сгенерированный машинный код, но хотел бы понять следующий сценарий:

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

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

anyFlag не изменяется в рамках всей программы,Будет ли компилятор генерировать MIL / машинный код для метода Action?Если да, то будет ли там проверка?

Ответы [ 2 ]

7 голосов
/ 15 ноября 2011

В вашем случае компилятор не будет фильтровать оператор if, потому что ваш anyFlag общедоступен (так что его можно изменить из нескольких мест) и поскольку значение установлено только в конструкторе, компилятор также теперь не имеет этого значениядо времени выполнения.

Следующий код делает то, что вы хотите:

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

    string s = null;
    if (flag)
    {
        s = "a";
    }
    else
    {
        s = "b";
    }
}

Если вы вставите этот код в Visual Studio, вы увидите сгенерированное предупреждение о том, что s = "b";никогда не будет достигнут, и этот код будет оптимизирован.

1 голос
/ 15 ноября 2011

Да, компилятор сгенерирует IL.Поскольку позже вы можете использовать отражение или Emit для вызова этого метода или изменения значения anyFlag, он сохраняет его.Вы можете показать это, разобрав созданный исполняемый файл с помощью ildasm , который поставляется с Visual Studio.

...