【问题标题】:Will #if RELEASE work like #if DEBUG does in C#?#if RELEASE 会像 C# 中的 #if DEBUG 一样工作吗?
【发布时间】:2009-02-03 15:58:26
【问题描述】:

在我看到的所有#if 编译器指令示例中,它们都使用“DEBUG”。我可以以相同的方式使用“RELEASE”来排除在调试模式下编译时我不想运行的代码吗?我想用这个块包围的代码会发送一堆电子邮件,我不想在测试时不小心把它们发送出去。

【问题讨论】:

  • #if !DEBUG 提供与#if RELEASE 相同的功能。或者,#if DEBUG 然后 #else 然后 #endif 如果在这些模式下运行不同的代码。

标签: c# .net debugging


【解决方案1】:

RELEASE没有定义,但是可以使用

#if (!DEBUG)
  ...
#endif

【讨论】:

  • 不是,但你当然可以像这样使用 NOT 运算符。我写答案时没有想到这一点。
  • 确实如此,但使用您的解决方案更清晰,“更正确”,恕我直言。
  • 特别是因为您可以有更多的配置,而不仅仅是 RELEASE 和 DEBUG -- 对于我的一些项目,有 DEBUG、RELEASE 和 DEPLOY 或 DEV (DEBUG)、TEST 和 PROD (RELEASE)跨度>
  • 对于其他被上述 cmets 混淆的人,未经编辑的答案想知道是否定义了 RELEASE
【解决方案2】:

不,它不会,除非你做一些工作。

这里重要的部分是 DEBUG 的真正含义,它是一种定义的常量,编译器可以检查。

如果您检查项目属性,在 Build 选项卡下,您会发现三件事:

  • 标有“条件编译符号”的文本框
  • 标记为“定义调试常量”的复选框
  • 标记为“定义 TRACE 常数”的复选框

没有这样的复选框,也没有名为 RELEASE 的常量/符号预定义。

但是,您可以轻松地将该名称添加到标有条件编译符号的文本框中,但请确保在执行此操作之前将项目配置设置为发布模式,因为这些设置是针对每个配置的。

所以基本上,除非您将其添加到文本框中,否则#if RELEASE 在任何配置下都不会生成任何代码。

【讨论】:

    【解决方案3】:

    不。

    在调试配置中有一个 DEBUG 定义的常量(由 Visual Studio 自动定义),而没有为发布模式定义这样的常量。检查构建下的项目设置。

    Project -> Build下选择[Define DEBUG constant]就像在每个文件的开头都包含#define DEBUG。

    如果您想为发布配置定义一个 RELEASE 常量,请转到:

    • 项目属性 -> 构建
    • 选择发布模式
    • 条件编译符号文本框中输入:RELEASE

    【讨论】:

    • 发现这非常有用,因为我现在为我的发布配置定义了一个 RELEASE 常量,为我的测试配置定义了一个 TESTING 常量。对于定义 require https 非常有用,仅用于发布#if (RELEASE) [RequireHttps] #endif
    【解决方案4】:

    在我的 VS 安装(VS 2008)上,#if RELEASE 不起作用。但是你可以使用#if !DEBUG

    例子:

    #if !DEBUG
    SendTediousEmail()
    #endif
    

    【讨论】:

      【解决方案5】:

      我以前从未见过……但我见过:

      #if (DEBUG == FALSE)
      

      #if (!DEBUG)
      

      这对你有用吗?

      【讨论】:

      • 预处理器符号在 C# 中没有值;它们只是“定义”或“未定义”。所以只有 ! 运算符可以工作,就像你的第二个例子一样。
      • 根据 MSDN,您可以使用 == 之类的运算符来测试真假。 msdn.microsoft.com/en-us/library/4y6tbswk.aspx
      【解决方案6】:

      您可以为此目的使用#if(!DEBUG)

      【讨论】:

      • 对我来说很好,因为我想在 xamrian 中使用它,感谢发帖。
      【解决方案7】:

      “Pop Catalin”是对的。根据构建类型控制定义提供了很大的灵活性。例如,您可以在同一个解决方案中拥有“DEBUG”、“DEMO”和“RELEASE”配置。这样就无需使用两种不同的解决方案进行重复编程。

      所以当定义了 RELEASE Con​​ditional 编译符号时,#if RELEASE#if (RELEASE) 的工作方式与 #if DEBUG 相同。

      以下内容摘自“Pop Catalin”帖子: 如果要为发布配置定义 RELEASE 常量,请访问: * 项目属性 -> 构建 * 选择发布模式 * 在条件编译符号文本框中输入:RELEASE

      【讨论】:

        【解决方案8】:

        我知道这是一个老问题,但值得一提的是,您可以在 DEBUG 和 RELEASE 之外创建自己的配置,例如 TEST 或 UAT。

        如果然后在项目属性页面的 Build 选项卡上将“条件编译符号”设置为 TEST(例如),则可以使用诸如

        之类的构造
        #if (DEBUG || TEST )
            //Code that will not be executed in RELEASE or UAT
        #endif
        

        您可以出于特定原因使用此构造,例如,如果您有需要,可以使用不同的客户端,甚至可以使用整个 Web 方法。我们过去也使用过这种方式,其中一些命令会导致特定硬件出现问题,因此我们在部署到硬件 X 时为应用配置了配置。

        【讨论】:

          【解决方案9】:

          您可以创建自己的条件编译时符号(您喜欢的任何名称)。 转到位于项目属性框中的“项目构建对话框”, 菜单选项:Project->[projectname] Properties...

          您还可以在“C# 代码文件的顶部”定义它们。喜欢:

          #define RELEASE
          // or
          #undef RELEASE
          

          您可以在#if 语句中使用该符号:

          #if RELEASE
          // code ...
          #elif …
          // code ...
          #endif
          
          // or
          
          #if !RELEASE
          // code ...
          #endif
          

          【讨论】:

            【解决方案10】:

            虽然M4N's answer (#if (!DEBUG)) 最有意义,但另一种选择是使用预处理器修改其他标志的值;例如

            bool isRelease = true;
            #if DEBUG
                isRelease = false;
            #endif
            

            或者更好,而不是指我们是处于发布模式还是调试模式,而是使用定义预期行为的标志并根据模式设置它们:

            bool sendEmails = true;
            #if DEBUG
                sendEmails = false;
            #endif
            

            这与使用预处理器标志不同,因为这些标志仍然存在于生产环境中,因此每次调用该代码时都会产生if (sendEmails) {/* send mails */} 的开销,而不是在发布中存在但在调试中不存在的代码,但是这可能是有利的;例如在您的测试中,您可能希望在模拟中调用 SendEmails() 方法,同时在调试中运行以获得额外的输出。

            【讨论】:

              【解决方案11】:

              另一种选择:

              #If CONFIG = "Release" Then
              
              ....
              
              #End If
              

              【讨论】:

                【解决方案12】:

                为什么不直接

                #if RELEASE
                #undef DEBUG
                #endif
                

                【讨论】:

                • 发布模式下Visual Studio没有定义名为RELEASE的常量。
                • /d:RELEASE 也可以。您还可以将其添加到发布配置下的条件编译符号(项目属性构建选项卡)。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-08-12
                • 2023-03-18
                • 2011-04-16
                相关资源
                最近更新 更多