将#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