Директивы компилятора - Предложение - Запускать код только в режиме отладки - PullRequest
1 голос
/ 04 июля 2011

Мне нужно регистрировать сообщения только тогда, когда приложение работает в режиме отладки.Я нашел 2 способа:

Первый : необходимо написать 3 строки везде, когда требуется регистрация.Но оператор Logger отключен только во время компиляции, и это именно то, что мне нужно.Logger.Log не будет выполнен вообще.

#if DEV_ENV
        Logger.Log("Application started !"); // This line is grayed. Perfect !
#endif

public static void Log(string message)
{
    Debug.WriteLine(message);
}

Second : Очень аккуратно.Только одна строка кода везде, где требуется регистрация.Не уверен, выполнен оператор Logger.Log или нет. Если вызов функции удаляется только во время компиляции (аналогично первому подходу. Но теперь, если строка кода не выделена серым цветом), я хочу пойти с этим.

Logger.Log("Application started !"); // This line is not grayed out. But, function is not called. So, confused whether its removed at compile time.

[Conditional("DEV_ENV")]
public static void Log(string message)
{
    Debug.WriteLine(message);
}

Меня беспокоит разница в производительности.

Ответы [ 3 ]

2 голосов
/ 04 июля 2011

На странице MSDN для ConditionalAttribute :

Применение ConditionalAttribute к методу указывает компиляторам, что вызов метода долженне может быть скомпилировано в промежуточный язык Microsoft (MSIL), если не определен условный символ компиляции, связанный с ConditionalAttribute.

Так что, как говорится, вызов метода удаляется во время компиляции,такой же как #if.

0 голосов
/ 04 июля 2011

Как указывает Джордж, вызов метода не будет компилироваться, если применяется атрибут Conditional.Это также означает (как при удалении кода непосредственно с помощью #If DEV_ENV), что любые побочные эффекты, включенные в вызов метода, также не будут возникать - как всегда, предупреждение о наличии побочных эффектов в журналирующем коде вполне обосновано:*

Если SKIP не определено, этот код печатает 92.Если определено SKIP, будет напечатано 92 became 93 и 93.

0 голосов
/ 04 июля 2011

В зависимости от настроек компиляции вы можете использовать:

if (System.Diagnostics.Debugger.IsAttached)
   Logger.Log("Application started !"); 

или

#if DEBUG
    Logger.Log("Application started !"); 
#endif 
...