#if RELEASE 会像 C# 中的 #if DEBUG 一样工作吗?
Posted
技术标签:
【中文标题】#if RELEASE 会像 C# 中的 #if DEBUG 一样工作吗?【英文标题】:Will #if RELEASE work like #if DEBUG does in C#? 【发布时间】:2009-02-03 15:58:26 【问题描述】:在我看到的所有#if 编译器指令示例中,它们都使用“DEBUG”。我可以以相同的方式使用“RELEASE”来排除在调试模式下编译时我不想运行的代码吗?我想用这个块包围的代码会发送一堆电子邮件,我不想在测试时不小心把它们发送出去。
【问题讨论】:
#if !DEBUG
提供与#if RELEASE
相同的功能。或者,#if DEBUG
然后 #else
然后 #endif
如果在这些模式下运行不同的代码。
【参考方案1】:
RELEASE
没有定义,但是可以使用
#if (!DEBUG)
...
#endif
【讨论】:
不是,但你当然可以像这样使用 NOT 运算符。我写答案时没有想到这一点。 确实如此,但使用您的解决方案更清晰,“更正确”,恕我直言。 特别是因为您可以有更多的配置,而不仅仅是 RELEASE 和 DEBUG -- 对于我的一些项目,有 DEBUG、RELEASE 和 DEPLOY 或 DEV (DEBUG)、TEST 和 PROD (RELEASE)跨度> 对于其他被上述 cmets 混淆的人,未经编辑的答案想知道是否定义了RELEASE
。【参考方案2】:
不,它不会,除非你做一些工作。
这里重要的部分是 DEBUG 的真正含义,它是一种定义的常量,编译器可以检查。
如果您检查项目属性,在 Build 选项卡下,您会发现三件事:
标有“条件编译符号”的文本框 标记为“定义调试常量”的复选框 标记为“定义 TRACE 常数”的复选框没有这样的复选框,也没有名为 RELEASE 的常量/符号预定义。
但是,您可以轻松地将该名称添加到标有条件编译符号的文本框中,但请确保在执行此操作之前将项目配置设置为发布模式,因为这些设置是针对每个配置的。
所以基本上,除非您将其添加到文本框中,否则#if RELEASE
在任何配置下都不会生成任何代码。
【讨论】:
【参考方案3】:不。
在调试配置中有一个 DEBUG
定义的常量(由 Visual Studio 自动定义),而没有为发布模式定义这样的常量。检查构建下的项目设置。
在Project -> Build下选择[Define DEBUG constant]就像在每个文件的开头都包含#define DEBUG。
如果您想为发布配置定义一个 RELEASE 常量,请转到:
项目属性 -> 构建 选择发布模式 在条件编译符号文本框中输入:RELEASE【讨论】:
发现这非常有用,因为我现在为我的发布配置定义了一个 RELEASE 常量,为我的测试配置定义了一个 TESTING 常量。对于定义 require https 非常有用,仅用于发布#if (RELEASE) [RequireHttps] #endif
【参考方案4】:
在我的 VS 安装(VS 2008)上,#if RELEASE
不起作用。但是你可以使用#if !DEBUG
例子:
#if !DEBUG
SendTediousEmail()
#endif
【讨论】:
【参考方案5】:我以前从未见过……但我见过:
#if (DEBUG == FALSE)
和
#if (!DEBUG)
这对你有用吗?
【讨论】:
预处理器符号在 C# 中没有值;它们只是“定义”或“未定义”。所以只有!
运算符可以工作,就像你的第二个例子一样。
根据 MSDN,您可以使用 == 之类的运算符来测试真假。 msdn.microsoft.com/en-us/library/4y6tbswk.aspx【参考方案6】:
您可以为此目的使用#if(!DEBUG)
。
【讨论】:
对我来说很好,因为我想在 xamrian 中使用它,感谢发帖。【参考方案7】:“Pop Catalin”是对的。根据构建类型控制定义提供了很大的灵活性。例如,您可以在同一个解决方案中拥有“DEBUG”、“DEMO”和“RELEASE”配置。这样就无需使用两种不同的解决方案进行重复编程。
所以当定义了 RELEASE Conditional 编译符号时,#if RELEASE
或 #if (RELEASE)
的工作方式与 #if DEBUG
相同。
以下内容摘自“Pop Catalin”帖子: 如果要为发布配置定义 RELEASE 常量,请访问: * 项目属性 -> 构建 * 选择发布模式 * 在条件编译符号文本框中输入:RELEASE
【讨论】:
【参考方案8】:我知道这是一个老问题,但值得一提的是,您可以在 DEBUG 和 RELEASE 之外创建自己的配置,例如 TEST 或 UAT。
如果然后在项目属性页面的 Build 选项卡上将“条件编译符号”设置为 TEST(例如),则可以使用诸如
之类的构造#if (DEBUG || TEST )
//Code that will not be executed in RELEASE or UAT
#endif
您可以出于特定原因使用此构造,例如,如果您有需要,可以使用不同的客户端,甚至可以使用整个 Web 方法。我们过去也使用过这种方式,其中一些命令会导致特定硬件出现问题,因此我们在部署到硬件 X 时为应用配置了配置。
【讨论】:
【参考方案9】:您可以创建自己的条件编译时符号(您喜欢的任何名称)。 转到位于项目属性框中的“项目构建对话框”, 菜单选项:Project->[projectname] Properties...
您还可以在“C# 代码文件的顶部”定义它们。喜欢:
#define RELEASE
// or
#undef RELEASE
您可以在#if 语句中使用该符号:
#if RELEASE
// code ...
#elif …
// code ...
#endif
// or
#if !RELEASE
// code ...
#endif
【讨论】:
【参考方案10】:虽然M4N's answer (#if (!DEBUG)
) 最有意义,但另一种选择是使用预处理器修改其他标志的值;例如
bool isRelease = true;
#if DEBUG
isRelease = false;
#endif
或者更好,而不是指我们是处于发布模式还是调试模式,而是使用定义预期行为的标志并根据模式设置它们:
bool sendEmails = true;
#if DEBUG
sendEmails = false;
#endif
这与使用预处理器标志不同,因为这些标志仍然存在于生产环境中,因此每次调用该代码时都会产生if (sendEmails) /* send mails */
的开销,而不是在发布中存在但在调试中不存在的代码,但是这可能是有利的;例如在您的测试中,您可能希望在模拟中调用 SendEmails()
方法,同时在调试中运行以获得额外的输出。
【讨论】:
【参考方案11】:另一种选择:
#If CONFIG = "Release" Then
....
#End If
【讨论】:
【参考方案12】:为什么不直接
#if RELEASE
#undef DEBUG
#endif
【讨论】:
发布模式下Visual Studio没有定义名为RELEASE的常量。/d:RELEASE
也可以。您还可以将其添加到发布配置下的条件编译符号(项目属性构建选项卡)。以上是关于#if RELEASE 会像 C# 中的 #if DEBUG 一样工作吗?的主要内容,如果未能解决你的问题,请参考以下文章
Android Studio 中有没有类似C#的#if DEBUG功能
Javascript、Razor/MVC3 中的 C# if 语句