【问题标题】:What is the usage of #if DEBUG pre-processor directive in C#? When must we use this?#if DEBUG 预处理器指令在 C# 中的用途是什么?我们什么时候必须使用它?
【发布时间】:2011-02-20 20:36:50
【问题描述】:

#if DEBUG 在 C# 中的预处理指令有什么用?我们什么时候必须使用它?

【问题讨论】:

    标签: c# debugging c-preprocessor


    【解决方案1】:

    编译时,您可以设置编译器标志,您可以使用这些标志将代码放入这些指令中。该代码将不会被编译,并且永远不会出现在最终的汇编输出中。 DEBUG 是预定义的之一,但您可以使用自己的。

    作为使用示例:在当前的开发中,我们使用编译器标志来说明是使用登录掩码登录用户,还是使用当前主体自动登录。第二种模式仅供开发人员使用,例如无需登录即可更快地调试。

    另一个例子:在一些单声道代码中你会看到标志。在这种情况下,代码可能会以不同的方式编译,例如针对不同的框架,因为它使用早期版本中可能不存在的类。

    与此相关的是 Conditional-属性,您可以使用它来标记方法。如果未设置所述标志,则不会执行对该方法的调用。该方法仍然在 IL 中结束,但调用将被删除。

    查看以下代码示例:

    var mthods = typeof (Debug).GetMethods().Where(mi => mi.Name.Equals("WriteLine")).ToList();
    var attribs = mthods[0].GetCustomAttributes(true);
    

    您会注意到 Debug.WriteLine 方法应用了 Conditional 属性:当您在没有 DEBUG 编译器标志的情况下进行编译时,对它的调用将被删除。

    【讨论】:

      【解决方案2】:

      在调试模式下:

      #if DEBUG
                  System.Console.WriteLine("Debug version");
      #endif
                  System.Console.WriteLine("Output");
      

      输出为

      Debug version
      Output
      

      在发布模式下:

      #if DEBUG
                  System.Console.WriteLine("Debug version");
      #endif
                  System.Console.WriteLine("Output");
      

      输出为

         Output
      

      阅读:#if (C# Reference)

      用法:如果您有一组值要在调试模式下而不是在发布模式下进行测试,您可以使用#if DEBUG

      【讨论】:

        【解决方案3】:

        它在测试 Windows 服务时也会派上用场。您可以添加#if DEBUG 来手动启动您的进程,因此您不必安装服务并附加到它进行调试。

        【讨论】:

          【解决方案4】:

          Conditional 属性可能会让您感觉更舒服,该属性可用于排除整个方法,而无需在调用端使用条件使源复杂化:

          [Conditional("DEBUG")]
          void Foo()
          {
          }
          

          Foo() 可以在调试和发布中安全地调用 - 但是在发布模式下,这将是一个空操作。

          【讨论】:

          • 这是一个特殊的 IL 命令,本质上说“什么都不做”。当您将断点放在什么都没有发生的地方(例如左括号)时特别有用 - 这样调试器就可以同步代码并执行 IL
          • 有没有办法否定参数(即!DEBUG)?
          【解决方案5】:

          您根本不必使用它。它的目的是让部分代码只能在调试模式下编译。例如您可能有一些代码启用了主用户,可以伪装成系统中的任何其他用户来进行测试和调试目的。出于安全原因,您不希望在发布代码中启用该用户,因此您可以将相关代码部分包装在 #if DEBUG 中,并将它们从发布代码中排除。

          【讨论】:

          • 或者简单地说,调试时不显示启动画面,节省一两秒。类似的东西。
          猜你喜欢
          • 1970-01-01
          • 2010-11-01
          • 2019-12-27
          • 2011-04-07
          • 2011-01-22
          • 2011-05-20
          • 2011-01-16
          • 2011-01-16
          • 2011-01-21
          相关资源
          最近更新 更多