【问题标题】:Compilter Directives - Suggestion - Run code in Debug mode only编译器指令 - 建议 - 仅在调试模式下运行代码
【发布时间】:2011-07-04 08:23:10
【问题描述】:

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

第一:需要记录的时候需要到处写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);
}

我担心性能差异。

【问题讨论】:

    标签: c# performance compiler-directives


    【解决方案1】:

    来自MSDN 页面的ConditionalAttribute

    将 ConditionalAttribute 应用于 方法向编译器表明 a 不应该调用该方法 编译到微软中间 语言 (MSIL) 除非有条件 关联的编译符号 定义了 ConditionalAttribute。

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

    【讨论】:

      【解决方案2】:

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

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

      或者,

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

      【讨论】:

        【解决方案3】:

        正如 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

        【讨论】:

        • 谢谢。问题:将 Log(string.Format("{0} 变成 {1}", i++, i));语句在汇编中编译?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-09
        • 1970-01-01
        • 1970-01-01
        • 2017-07-10
        相关资源
        最近更新 更多