Условная компиляция в .NET

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

Такие задачи можно решать по старинке - комментировать или необорот убирать комментарии с кода, который не нужно или наоборот нужно добавить в исполняемый файл. Это метод не очень хорош, потому что программисты всегда забывают сделать нужное действие перед компиляцией и вы можете выкинуть в релиз некорректный продукт, но раньше другого выхода и не было. Это уж слишком старый подход к программированию и лучше воспользоваться условной компиляцией, которая существует уже давно во многих современных языках и С# не стал выделяться, потому что это удобно.

Итак, условная компиляция оформляется следующим образом:

#if СИМВОЛ
  Код 1
#endif

"Код 1" будет выполнен только если СИМВОЛ определен. А что такое символ? Для нас среда разработки уже определила два символа DEBUG и TRACE. Первый является истиной, когда вы скомпилировали программу в конфигурации отладки Debug, а не Release. Намример:

#if DEBUG
  MessageBox.Show("Вы запустили отладочную версию!!");
#endif

Если вы запустили отладочную версию (по умолчанию из директории bin\Debug вашего проекта), то на экране появится сообщение. Если это не отладочная версия, то сообщения не будет.

Следующий символ, который предопределила для нас среда разработки - TRACE. Он отрабатывает, когда вы пошагово трассируете программу:

#if DEBUG
  MessageBox.Show("Идет трассировка!!");
#endif

А что, если вы работаете в версии Express Edition, которая не имеет возможности переключать конфигурации? В ней есть возможность задать эти параметры, если зайти в окно свойств проекта. Щелкните правой кнопкой по имени проекта в окне Solution Explorer и выберите пункт Properties. Перейдите на закладку Build. Здесь есть два индикатора, с помощью которых вы можете включать эти слова или отключать:

Условия могут быть и более сложными, потому что вы можете использовать еще логику "иначе"

#if DEBUG
  MessageBox.Show("Вы запустили отладочную версию!!");
#else
  MessageBox.Show("Это не debug версия!!");
#endif

Первое окно сообщения появится на экране, если вы используете Debug версию исполняемого файла, иначе будет отображено второе сообщение.

#if СИМВОЛ1
  Код1
#elif СИМВОЛ2
  Код2
#endif

В этом примере, если установлен СИМВОЛ1, то будет выполнен Код1, иначе произойдет проверка на наличие СИМВОЛ2 и Код2 будет выполнен только если СИМВОЛ2 установлен.

Вы можете создавать свои собственные символы. Для этого используется ключевое слово #define. Например:

#define MY_SYMBOL

#if MY_SYMBOL
  // Мой код
#endif

Теперь код будет выполнен только если символ MY_SYMBOL установлен с помощью #define. Такой метод удобен, когда вам нужно в проекте во множестве мест использовать специфичный код. Чтобы включить работу кода, достаточно написать одну строку, а для отключения, просто удаляем #define MY_SYMBOL.



Внимание!!! Если ты копируешь эту статью себе на сайт, то оставляй ссылку непосредственно на эту страницу. Спасибо за понимание

О блоге

Программист, автор нескольких книг серии глазами хакера и просто блогер. Интересуюсь безопасностью, хотя хакером себя не считаю

Обратная связь

Без проблем вступаю в неразборчивые разговоры по e-mail. Стараюсь отвечать на письма всех читателей вне зависимости от страны проживания, вероисповидания на русском или английском языке.

Пишите мне


Я в социальных сетях
Facebook Telegram Youtube Програмысли Instagram