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

时间:2009-02-03 15:58:27

标签: c# .net debugging

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

12 个答案:

答案 0 :(得分:367)

RELEASE未定义,但您可以使用

#if (!DEBUG)
  ...
#endif

答案 1 :(得分:253)

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

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

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

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

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

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

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

答案 2 :(得分:35)

不。

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

项目下选择[定义DEBUG常量] - >构建就像在每个文件的开头包含#define DEBUG一样。

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

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

答案 3 :(得分:24)

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

示例:

#if !DEBUG
SendTediousEmail()
#endif

答案 4 :(得分:9)

我以前从未见过......但我看到了:

#if (DEBUG == FALSE)

#if (!DEBUG)

你的工作是什么?

答案 5 :(得分:6)

您可以将#if(!DEBUG)用于此目的。

答案 6 :(得分:4)

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

所以,当定义RELEASE条件编译符号时,#if RELEASE#if (RELEASE)#if DEBUG的工作方式相同。

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

答案 7 :(得分:2)

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

如果然后在项目属性页面的Build选项卡上,则设置"条件编译符号"然后,您可以使用诸如

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

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

答案 8 :(得分:0)

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

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

#define RELEASE
// or
#undef RELEASE

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

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

// or

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

答案 9 :(得分:0)

虽然M4N's answerbool isRelease = true; #if DEBUG isRelease = false; #endif )最有意义,但另一种选择可能是使用预处理器来修改其他标志的值。例如

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

或者更好的是,与其参考我们是处于发布还是调试模式,不如使用标志定义预期的行为并根据模式进行设置:

if (sendEmails) {/* send mails */}

这与使用预处理器标志不同,因为标志仍在生产中使用,因此每次调用代码时都会产生SendEmails()的开销,而不是发布中存在但调试中不存在的代码,但这可能是有利的;例如在您的测试中,您可能想调用{{1}}方法,但是要在模拟中调用,同时在调试中运行以获取其他输出。

答案 10 :(得分:0)

另一种选择:

#If CONFIG = "Release" Then

....

#End If

答案 11 :(得分:-7)

为什么不只是

#if RELEASE
#undef DEBUG
#endif