Будет ли оператор if и его содержимое удалено компилятором? В качестве альтернативы, если значение константы Debug равно true, компилятор удалит проверку состояния и сохранит содержимое на месте?
Да, и да. Однако это детали реализации, а не гарантии языка.
Некоторых интересных аспектов использования if(false)
для управления условной компиляции:
сборника не является условным вообще; тело if
будет скомпилировано точно так же, как и любой другой код. Если он содержит синтаксические ошибки, вы получите синтаксические ошибки. Если он содержит ошибки разрешения перегрузки, вы получите ошибки разрешения перегрузки. «Перейти к использованию», и другие функции IDE продолжают работать.
Это очень отличается от управления с помощью #if false
; текст, который опущен из-за препроцессора, рассматривается как комментарии. «Перейти к использованию» не найдет использование, которое условно скомпилировано, вы не получите синтаксическую раскраску и т. Д. Тем не менее, код может быть полностью нарушен, потому что, в конце концов, это просто комментарий.
Однако первый момент - легкая ложь; есть одно отличие. Код внутри if(false)
не проверяется на определенные ошибки присваивания:
int x;
if (false)
Console.WriteLine(x); // no error!
Потому что в конце концов, нет никакого способа, что х будет прочитать до того, как написано в этом фрагменте программы!
Вы пытались просмотреть msil –
Загрузите Linqpad, и вы сможете проверить себя через 2 минуты. – BrokenGlass
Для членов 'const' инструкция' if' исчезнет. Для членов 'static readonly' оператор останется. – dlev