C# компилирует код в если (ложный) блок?

Я просто задаюсь вопросом, компилируются ли эти блоки кода в .dll

Я не думаю, что этот компилируется вообще

#if SOMETHING_UNDEFINED
// some code - this is ignored by the compiler
#endif

Теперь что относительно них?

1.

if(false) {
  // some code - is this compiled?
}

2.

const bool F = false;
if(F) {
  // some code - is this compiled?
}

3.

bool F = false;
if(F) {
  // some code - is this compiled?
}

Править: Извините, я говорил о Visual Studio

13
задан Aximili 6 May 2010 в 23:34
поделиться

2 ответа

Просто протестируйте его, компилятор Microsoft C # 4 этого не делает, и похоже, что компилятор Mono gmcs версии 2.4.0.0 тоже этого не делает. Я не знаю, есть ли что-нибудь в спецификации , запрещающее это, однако.

РЕДАКТИРОВАТЬ: Когда я ответил на это, была представлена ​​только первая версия. Случай 2 эквивалентен случаю 1, но случай 3 - нет.

7
ответ дан 2 December 2019 в 01:41
поделиться

Просто дополнение к ответу:

Я верю, что он выполняет только статическую проверку. в первом случае if (false) он увидит, что этот недостижимый код с помощью простой проверки шаблона, поэтому он не будет его компилировать (также должен выдать предупреждение).

Во втором случае, поскольку F является константой и знает, что никогда не изменяется, при статической проверке он может просто выполнить подстановку. [F-> false] << body >>. и это даст тот же код, что и первый.

Последний вариант сложен. Поскольку невозможно знать, что 100% с помощью статической проверки только то, что значение F. У C #, как и у всех императивных языков, есть побочные эффекты.

представьте, если вы немного переписываете код.

bool F = false; 
foo(ref F);
if(F) { 
  // some code - is this compiled? 
} 

Проблема в том, что он не знает, что foo делает с F., чтобы узнать, ему придется отслеживать (и, возможно, оценивать) функцию, теперь представьте в конце концов, очень большие программы с множеством этих шаблонов, если операторы используются много, попытка найти значение времени выполнения F для всех этих операторов будет очень медленной и трудоемкой, а иногда даже невозможной.

1
ответ дан 2 December 2019 в 01:41
поделиться