Как сделать компиляцию отличной в Debug против Release?

Я новичок в 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 ответов

Решение

Эквивалентом является атрибут [Conditional] метода. Как это:

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

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

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

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

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

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

При этом вы можете добавить директивы препроцессора, например:

#if DEBUG

//  debug code here

#endif

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

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

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

/// <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;
}
Другие вопросы по тегам