В свойствах решения у меня есть Конфигурация, установленная на «выпуск» для моего единственного проекта.
В начале основной процедуры у меня есть этот код, и он показывает «Mode = Debug». У меня также есть эти две строки в самом верху:
#define DEBUG
#define RELEASE
Я проверяю правильную переменную?
#if (DEBUG)
Console.WriteLine("Mode=Debug");
#elif (RELEASE)
Console.WriteLine("Mode=Release");
#endif
Моя цель - установить разные значения по умолчанию для переменных в зависимости от режима отладки и выпуска.
c#
debugging
release
compiler-directives
NealWalters
источник
источник
Ответы:
DEBUG
/_DEBUG
должны быть определены в VS уже.Удалите
#define DEBUG
в своем коде. Установите препроцессоры в конфигурации сборки для этой конкретной сборки.Причина, по которой он печатает «Mode = Debug», из-за вашего,
#define
а затем пропускаетelif
.Правильный способ проверить это:
Не проверяйте
RELEASE
.источник
#if
и нет#ifdef
?#ifdef
относится к препроцессору C / C ++, C # требует использования#if
.По умолчанию Visual Studio определяет DEBUG, если проект компилируется в режиме отладки, и не определяет его, если он находится в режиме выпуска. RELEASE не определяется в режиме Release по умолчанию. Используйте что-то вроде этого:
Если вы хотите сделать что-то только в режиме релиза:
Также стоит отметить, что вы можете использовать
[Conditional("DEBUG")]
атрибут в методах, которые возвращаются,void
чтобы они выполнялись, только если определен определенный символ. Компилятор удалит все вызовы этих методов, если символ не определен:источник
Я предпочитаю проверять это так, а не искать
#define
директивы:С оговоркой, что вы, конечно, можете скомпилировать и развернуть что-то в режиме отладки, но при этом отладчик не будет подключен.
источник
#IF DEBUG
в ситуации отладки код, который не должен длиться долго. Для производственного кода я согласен с использованием выше.#DEBUG
состоит в том, что оператор if находится в вашем коде и всегда проверяется, где в качестве#DEBUG
ответа удаляется код, который не применим во время компиляции, поэтому у вас нет проверки во время выполнения и вашей. exe (или все, что вы компилируете) меньше.Я не большой поклонник вещей #if, особенно если вы распространяете их по всей базе кода, так как это создаст вам проблемы, когда сборки Debug проходят, но сборки Release терпят неудачу, если вы не будете осторожны.
Итак, вот что я придумал (вдохновленный #ifdef в C # ):
источник
DebuggingService
не статический класс и зачем вам интерфейс? Это как-то связано с использованием этого с контейнером IoC?Метод
Debug.Assert
имеет условный атрибутDEBUG
. Если он не определен, вызов и назначениеisDebug = true
будут устранены :Если
DEBUG
определено,isDebug
устанавливается вtrue
(и передаетсяDebug.Assert
, что ничего не делает в этом случае).источник
var iterations = 10; Debug.Assert((iterations = Int32.MaxValue) > 0);
Если вы пытаетесь использовать переменную, определенную для типа сборки, вы должны удалить две строки ...
... это приведет к тому, что #if (DEBUG) всегда будет верным.
Также нет условного символа компиляции по умолчанию для RELEASE . Если вы хотите определить один переход к свойствам проекта, щелкните вкладку « Построение », а затем добавьте «RELEASE» в текстовое поле « Условные символы компиляции» под заголовком « Общие» .
Другим вариантом будет сделать это ...
источник
Удалить ваши определения в верхней части
источник
Слегка измененная (убитая?) Версия ответа Тода Томсона как статическая функция, а не отдельный класс (я хотел иметь возможность вызывать ее в привязке представления WebForm из класса viewutils, который я уже включил).
источник
Обязательно определите константу DEBUG в свойствах сборки проекта. Это позволит
#if DEBUG
. Я не вижу заранее определенной константы RELEASE, поэтому это может означать, что все, что не находится в блоке DEBUG, находится в режиме RELEASE.источник
NameSpace
метод
источник
Совет, который может сэкономить вам много времени - не забывайте, что даже если вы выбираете
debug
в конфигурации сборки (в меню vs2012 / 13 она находится в разделе BUILD => КОНФИГУРАЦИОННЫЙ МЕНЕДЖЕР) - этого недостаточно.Вам нужно обратить внимание на ИЗДАНИЕ
Configuration
, как таковое:источник
Поскольку целью этих директив COMPILER является указание компилятору НЕ включать код, отладочный код, бета-код или, возможно, код, который нужен всем вашим конечным пользователям, за исключением, скажем, тех, кто занимается рекламным отделом, т.е. #Define AdDept, который вы хотите быть в состоянии включить или удалить их в зависимости от ваших потребностей. Без необходимости изменять исходный код, если, например, не AdDept сливается с AdDept. Тогда все, что нужно сделать, это включить директиву #AdDept на странице свойств параметров компилятора существующей версии программы и выполнить компиляцию, и все! код объединенной программы оживает !.
Вы также можете использовать декларативный для нового процесса, который не готов к прайм-тайму или который не может быть активным в коде, пока не пришло время его выпустить.
Во всяком случае, так я это делаю.
источник
Я подумал о лучшем способе. До меня дошло, что блоки #if фактически являются комментариями в других конфигурациях (при условии
DEBUG
илиRELEASE
; но верно для любого символа)источник
Удалите определения и проверьте, находится ли условие в режиме отладки. Вам не нужно проверять, находится ли директива в режиме выпуска.
Что-то вроде этого:
источник