Как сделать компиляцию отличной в Debug против Release? - PullRequest
14 голосов
/ 26 апреля 2011

Я новичок в C # и столкнулся с проблемой при компиляции проекта C #. Речь идет о журнале отладки в режимах Debug и Release. Я хочу, чтобы функция журнала вызывалась в режиме отладки, но не вызывалась в режиме выпуска, принимая во внимание производительность. Я знаю, в C / C ++ это легко сделать:

// this is C/C++ sample, not C#
#ifdef DEBUG
#define DebugLog(CString,__VA_ARGS__) LogFunction(CString,__VA_ARGS__)
#else
#define DebugLog
#endif

В приведенном выше коде C / C ++ DebugLog () компилируется и вызывается в режиме отладки, но не компилируется и не вызывается в режиме выпуска, поэтому производительность может быть гарантирована.

Есть ли так или иначе в C #, который работает как приведенные выше коды C / C ++?

Ответы [ 5 ]

18 голосов
/ 26 апреля 2011

В C # вы можете сделать

#if DEBUG
                //debug-mode only snippet go here.
#endif

Вот справочная документация для директивы #if.

15 голосов
/ 26 апреля 2011

Эквивалентом является атрибут [Условный] для метода.Например:

[Conditional("DEBUG")]
public static void DebugLog(string fmt, params object[] args) {
    // etc..
}

В сборке Release (без определения DEBUG) компилятор удаляет как метод, так и вызовы метода.Прежде чем заново изобретать это колесо, обязательно просмотрите классы Debug и Trace в .NET Framework, они уже это делают.И обладает большой гибкостью для перенаправления информации отладки / трассировки.

3 голосов
/ 26 апреля 2011

Вы можете сделать то же самое в C #.В свойствах проекта вы можете установить символ условной компиляции, например DEBUG.На самом деле, я думаю, что Visual Studio сделает это по умолчанию при создании проекта - он добавит флаг DEBUG, когда проект находится в режиме отладки, и удалит этот флаг, когда вы переключитесь в режим выпуска.Это можно настроить на вкладке «Свойства проекта» -> «Сборка».Вы также можете добавить свои собственные флаги для таких вещей, как код для конкретной платформы.Флаг Pocket_PC был известен тем, что занимался разработкой старых приложений для Windows Mobile на платформе .NET Compact Framework.

Благодаря этому вы можете добавить директивы препроцессора, например:

#if DEBUG

//  debug code here

#endif
0 голосов
/ 14 ноября 2013
/// <summary>Function to Set Debug Flag to true if DEBUG is in Effect</summary>
/// <param name="theDebugFlag">output - true if DEBUG, unchanged if RELEASE</param>
[Conditional("DEBUG")]
static void QueryDebugStatus(ref Boolean theDebugFlag)
{
theDebugFlag = true;
}
0 голосов
/ 26 апреля 2011

Другая методология, может включать атрибут «Условный», например

[Conditional("DEBUG")]
void DebugLog()
{
   // method code here
}

Более подробную информацию можно найти здесь, в MSDN

...