将#if释放工作像#if DEBUG在C#中的工作?

在所有我见过的#if编译器指令的例子中,他们使用“DEBUG”。 我是否可以使用“RELEASE”以相同的方式排除在debugging模式下编译时不想运行的代码? 我想用这个块包围的代码发出一堆电子邮件,而且我不想在testing时意外地发送这些邮件。

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

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

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

  • 标有“条件编译符号”的文本框
  • 标有“定义DEBUG常量”的checkbox
  • 标有“定义TRACE常量”的checkbox

没有这样的checkbox,也没有常量/符号预定义名称RELEASE。

但是,您可以轻松地将该名称添加到标有“条件编译符号”的文本框中,但请确保先将项目configuration设置为“发布”模式,因为这些设置是针对每个configuration的。

所以基本上,除非你把它添加到文本框中, #if RELEASE不会在任何configuration下产生任何代码。


编辑 :更正#ifdef到#if(感谢丹尼尔)

RELEASE没有定义,但可以使用

 #if (!DEBUG) ... #endif 

不。

在debuggingconfiguration中,有一个DEBUG定义的常量(由Visual Studio自动定义),而没有为释放模式定义这样的常量。 在构build下检查您的项目设置。

Project – > Build下面select[Define DEBUG constant]就像在每个文件的开头都包含#define DEBUG一样。

如果要为发行configuration定义RELEASE常量,请转至:

  • 项目属性 – >生成
  • select释放模式
  • 在“ 条件编译符号”文本框中input:RELEASE

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

例:

 #if !DEBUG SendTediousEmail() #endif 

我以前从来没有见过…但是我看到:

 #if (DEBUG == FALSE) 

 #if (!DEBUG) 

那对雅的工作?

“Pop Catalin”说得对。 根据构buildtypes来控制定义提供了很大的灵活性。 例如,您可以在同一个解决scheme中使用“DEBUG”,“DEMO”和“RELEASE”configuration。 这样可以避免使用两种不同的解决scheme重复编程。

所以是的,当RELEASE条件编译符号被定义时, #if RELEASE#if (RELEASE)#if DEBUG相同。

以下摘自“Pop Catalin”文章:如果您想为发布configuration定义RELEASE常量,请转到:*项目属性 – >构build *select发布模式*在条件编译符号文本框中input:RELEASE

你可以使用#if(!DEBUG)来达到这个目的。

我知道这是一个老问题,但值得一提的是,你可以在DEBUG和RELEASE之外创build自己的configuration,比如TEST或者UAT。

如果在项目属性页面的Build选项卡上,然后将“Conditional compilation symbols”设置为TEST(例如),则可以使用如

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

你可以使用这个结构的具体原因,如不同的客户端,如果你有需要,甚至整个Web方法。 过去我们也使用过这个命令,因为某些命令在特定的硬件上引起了问题,所以我们在部署到硬件X时有一个应用程序的configuration。

只是一个说明。 我非常肯定,当启用优化构build时,#if DEBUG从发布编译中删除。

为什么不呢

 #if RELEASE #undef DEBUG #endif