#if RELEASE 会像 C# 中的 #if DEBUG 一样工作吗?

Posted

技术标签:

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

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

【问题讨论】:

#if !DEBUG 提供与#if RELEASE 相同的功能。或者,#if DEBUG 然后 #else 然后 #endif 如果在这些模式下运行不同的代码。 【参考方案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 也可以。您还可以将其添加到发布配置下的条件编译符号(项目属性构建选项卡)。

以上是关于#if RELEASE 会像 C# 中的 #if DEBUG 一样工作吗?的主要内容,如果未能解决你的问题,请参考以下文章

Android Studio 中有没有类似C#的#if DEBUG功能

C# 测试代码#if DEBUG使用

Javascript、Razor/MVC3 中的 C# if 语句

三元?运算符与 C# 中的传统 If-else 运算符 [重复]

有没有比 C# 中的预处理器指令(#if 等)更好的东西?

c# if 不等于 怎么写?