【问题标题】:How to make compilation different between Debug against Release?如何使调试与发布之间的编译不同?
【发布时间】:2011-08-12 17:59:17
【问题描述】:

我是 C# 新手,在编译 C# 项目时遇到问题。这是关于调试和发布模式下的调试日志。 考虑到性能,我希望在调试模式下调用日志函数,而不是在发布模式下调用。 我知道在 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()是在Debug模式下编译调用的,而在Release模式下不编译调用,这样可以保证性能。

C# 中是否有类似上述 C/C++ 代码的功能?

【问题讨论】:

标签: c# debugging compilation release


【解决方案1】:

在 C# 中你可以这样做

#if DEBUG
                //debug-mode only snippet go here.
#endif

这是#if 指令的reference documentation

【讨论】:

    【解决方案2】:

    等效的是方法上的 [Conditional] 属性。像这样:

    [Conditional("DEBUG")]
    public static void DebugLog(string fmt, params object[] args) {
        // etc..
    }
    

    在发布版本(未定义 DEBUG)中,编译器删除了方法和对该方法的调用。在重新发明这个轮子之前,请务必查看 .NET 框架中的 Debug 和 Trace 类,它们已经这样做了。并且有很大的灵活性来重定向调试/跟踪信息。

    【讨论】:

    • 感谢大家的回答。我想这就是我想要的——即使不是在调试模式下编译。
    • 这仅在方法的返回类型为 void 时有效。所以你不能像那样装饰一个 MVC 动作。我最终使用了#if DEBUG
    【解决方案3】:

    您可以在 C# 中做同样的事情。在项目属性中,您可以设置条件编译符号,如DEBUG。事实上,我认为 Visual Studio 在您创建项目时会默认执行此操作 - 当项目处于调试模式时,它会添加一个 DEBUG 标志,并在您切换到发布模式时删除该标志。这可以在 Project Properties->Build 选项卡中进行配置。您还可以为特定于平台的代码等内容添加自己的标志。 Pocket_PC 标志因在 .NET Compact Framework 上进行老式 Windows Mobile 开发而闻名。

    有了这个,你可以像这样添加预处理器指令:

    #if DEBUG
    
    //  debug code here
    
    #endif
    

    【讨论】:

      【解决方案4】:

      其他方法,可以包括“条件”属性,如

      [Conditional("DEBUG")]
      void DebugLog()
      {
         // method code here
      }
      

      更多信息可以找到here in 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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-06
        • 2015-06-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-29
        相关资源
        最近更新 更多