编译器指令 - 建议 - 仅在调试模式下运行代码

时间:2011-07-04 08:23:10

标签: c# performance compiler-directives

我需要仅在应用程序在调试模式下运行时记录消息。我找到了两种方法:

首先:需要记录时,需要在任何地方写入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);
}

第二:非常整洁。在需要记录的任何地方只需要一行代码。不确定是否执行了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 个答案:

答案 0 :(得分:2)

MSDNConditionalAttribute页面:

  

将ConditionalAttribute应用于   方法向编译器指示 a   不应该调用方法   编译到Microsoft中间件   语言(MSIL)除非有条件   与之关联的编译符号   与ConditionalAttribute一起定义。

因此,正如它所说,方法调用在编译时被删除,与#if相同。

答案 1 :(得分:0)

根据您的编译设置,您可以使用:

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

或,

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

答案 2 :(得分:0)

正如George所指出的,如果应用了Conditional属性,则不会编译方法调用。这也意味着(与使用#If DEV_ENV直接删除代码一样),方法调用中包含的任何副作用也不会发生 - 一如既往,关于在日志代码中产生副作用的警告是有根据的:

public static void Main(String[] args)
{
    int i = 92;
    Log(string.Format("{0} became {1}", i++, i));
    Console.WriteLine(i);
    Console.ReadLine();
}

[Conditional("SKIP")]
private static void Log(string msg)
{
    Console.WriteLine(msg);
}

如果未定义SKIP,则此代码打印出92。如果定义了SKIP,则会打印92 became 9393