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

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

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

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

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

Ответ 1

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

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

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

Ответ 3

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

С этим вы можете добавить предпроцессорные директивы следующим образом:

#if DEBUG

//  debug code here

#endif

Ответ 4

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

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

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

Ответ 5

/// <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;
}