Подтвердить что ты не робот

Когда использовать директивы препроцессора в .net?

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

Итак, я посмотрел пример msdn здесь он имеет код:

#define DEBUG
// ...
#if DEBUG
    Console.WriteLine("Debug version");
#endif

Мои два вопроса:

  • в приведенном выше примере, почему они определяют DEBUG? У меня создалось впечатление, что был установлен, если вы компилируете в режиме debug v. Release?
  • смотря на другой пример, который имеет #define MYTEST, а затем записывает на консоль в зависимости от того, был ли он определен, но как это отличается от использования переменной? Что мне здесь не хватает?
4b9b3361

Ответ 1

Я бы рекомендовал использовать условный атрибут вместо встроенных операторов #if.

[Conditional("DEBUG")]
private void DeleteTempProcessFiles()
{
}

Это не только чище и проще читать, так как у вас нет #if, #else внутри вашего кода. Этот стиль менее подвержен ошибкам либо во время нормальных изменений кода, и как ошибки логического потока.

Ответ 2

Как правило, необязательные/условные символы компиляции будут предоставлены сборкой script. Довольно редко можно увидеть #define, за исключением очень отладочного кода (если вы понимаете, что я имею в виду).

Re, используя переменную; Я часто использую такие условия для обработки кода, который должен запускаться в разных режимах времени (mono, cf, silverlight и т.д.). Переменной не может быть достаточно, потому что код не может быть скомпилирован на неправильной платформе (отсутствующие типы/методы и т.д.).

В представленном примере я, вероятно, просто использовал бы Debug.WriteLine; так как это украшено [Conditional("DEBUG")], все вызовы к нему автоматически удаляются, если DEBUG не задано в сборке.

Ответ 3

в приведенном выше примере, почему они определяют DEBUG? Я был под впечатлением, которое было установлено, если вы скомпилируете в режиме debug v. Release?

Возможно, потому что это пример кода. Он предназначен для демонстрации того, как #ifdef и друзья работают. Я бы не ожидал, что вы определите такие символы в исходных файлах, если только это не для быстрого теста.

глядя на другой пример, который имеет "#define MYTEST", а затем записывает на консоль в зависимости от того, был ли он "определен", но как это отличается от использования переменной? Что мне здесь не хватает?

Если во время компиляции MYTEST не определен, компилятор фактически не выдает код между блоками #if и #endif. Поэтому результирующий IL будет меньше.

Также обратите внимание, что эти не являются директивами препроцессора на С#.

Ответ 4

Если вы используете переменную, весь ваш код скомпилирован, когда вы используете директивы препроцессора только часть кода, включенного в исполняемый файл/dll.

Ответ 5

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

Моя программа создает много промежуточных файлов на диске. Я использовал директиву #DEBUG для удаления этих файлов только в том случае, если мой проект находится в режиме выпуска, в противном случае я сохраняю этот файл, чтобы мы могли просматривать эти промежуточные файлы и определять, что происходит внутри.

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

#if (DEBUG==false)
    deleteTempFiles()
#endif

Ответ 6

У меня есть код, который нуждается в другой обработке при использовании среды Mono вместо CLR, поэтому у меня есть директива Mono в некоторых моих модулях. Я думаю, что это лучший пример, чем debug

Ответ 7

Я использовал его для многих вещей. Отладочные сообщения, которые мне нужны только в отладочных сборках; очистка временных файлов; включают диагностические функции или действия.