Я просто задаюсь вопросом, компилируются ли эти блоки кода в .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
Просто протестируйте его, компилятор Microsoft C # 4 этого не делает, и похоже, что компилятор Mono gmcs версии 2.4.0.0 тоже этого не делает. Я не знаю, есть ли что-нибудь в спецификации , запрещающее это, однако.
РЕДАКТИРОВАТЬ: Когда я ответил на это, была представлена только первая версия. Случай 2 эквивалентен случаю 1, но случай 3 - нет.
Просто дополнение к ответу:
Я верю, что он выполняет только статическую проверку. в первом случае 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 для всех этих операторов будет очень медленной и трудоемкой, а иногда даже невозможной.