#if RELEASE是否会像#if DEBUG在C#中那样工作?


277

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


3
#if !DEBUG具有相同的功能#if RELEASE。另外,#if DEBUG#else然后#endif,如果有不同的代码在运行模式。
纳特

Answers:


275

不,除非您做一些工作,否则不会。

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

如果检查项目属性,则在“构建”选项卡下,您会发现三件事:

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

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

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

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


393

RELEASE 未定义,但是您可以使用

#if (!DEBUG)
  ...
#endif

2
不是,但是您当然可以使用NOT运算符。我写我的答案时没有想到这一点。
Lasse V. Karlsen

4
可以,但是恕我直言,使用您的解决方案更清晰,更“正确”。
Daniel Schaffer

1
特别是由于您可以拥有的配置不仅仅是RELEASE和DEBUG -对于我的某些项目,DEBUG,RELEASE和DEPLOY或DEV(DEBUG),TEST和PROD(RELEASE)
Adam Nofsinger

对于任何其他对上述评论感到困惑的人,未经编辑的答案想知道是否RELEASE已定义。

41

不。

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

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

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

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

1
发现这非常有用,因为我现在为我的Release配置定义了RELEASE常量,为我的Testing配置定义了TESTING常量。对于定义仅要求发布的https非常有用#if (RELEASE) [RequireHttps] #endif
tekiegirl 2014年

26

在我的VS安装上(VS 2008)#if RELEASE无法正常工作。但是你可以使用#if !DEBUG

例:

#if !DEBUG
SendTediousEmail()
#endif



4

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

因此,是#if RELEASE#if (RELEASE)#if DEBUG定义RELEASE条件编译符号时相同。

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


2

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

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

#if (DEBUG || TEST )
    //Code that will not be executed in RELEASE or UAT
#endif

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


0

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

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

#define RELEASE
// or
#undef RELEASE

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

#if RELEASE
// code ...
#elif 
// code ...
#endif

// or

#if !RELEASE
// code ...
#endif

-8

为什么不只是

#if RELEASE
#undef DEBUG
#endif

3
在发布模式下,Visual Studio没有定义名为RELEASE的常量。
Pop Catalin's

1
/d:RELEASE也可以。您也可以将其添加到“发布”配置下的条件编译符号中(项目属性构建选项卡)。
SliverNinja-MSFT 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.