Как сделать компиляцию отличной от 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, они уже делают это. И имеют большую гибкость для перенаправления информации об отладке/трассировке.
Ответ 2
В С# вы можете сделать
#if DEBUG
//debug-mode only snippet go here.
#endif
Здесь справочная документация для директивы #if
.
Ответ 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;
}