Как сделать компиляцию отличной в 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;
}