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


当前回答

为什么不干脆

#if RELEASE
#undef DEBUG
#endif

其他回答

RELEASE没有定义,但是您可以使用

#if (!DEBUG)
  ...
#endif

不。

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

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

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

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

虽然M4N的答案(#if (!DEBUG))最有意义,但另一种选择可能是使用预处理器来修改其他标志的值;如。

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

或者更好的方法是,使用定义预期行为的标志,并根据模式设置它们,而不是引用我们是在发布模式还是调试模式:

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

这与使用预处理器标志是不同的,因为这些标志在生产中仍然存在,所以每次调用该代码时,您都会产生if (sendEmails) {/* send邮件*/}的开销,而不是在发布版中存在但在调试中不存在的代码,但这可能是有利的;例如,在你的测试中,你可能想要调用你的SendEmails()方法,但在模拟上,同时在调试中运行以获得额外的输出。

我以前从来没见过……但我已经看到:

#if (DEBUG == FALSE)

and

#if (!DEBUG)

对你有用吗?

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

你也可以在c#代码文件的顶部定义它们。如:

#define RELEASE
// or
#undef RELEASE

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

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

// or

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