ChatGPT解决这个技术问题 Extra ChatGPT

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

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

#if !DEBUG 提供与 #if RELEASE 相同的功能。或者,如果在这些模式下运行不同的代码,则 #if DEBUG 然后 #else 然后 #endif

C
CharlesB

RELEASE 未定义,但您可以使用

#if (!DEBUG)
  ...
#endif

不是,但您当然可以像这样使用 NOT 运算符。我写答案的时候没有想到这一点。
确实如此,但恕我直言,使用您的解决方案更清晰、“更正确”。
特别是因为您可以有更多的配置,而不仅仅是 RELEASE 和 DEBUG——对于我的一些项目,有 DEBUG、RELEASE 和 DEPLOY 或 DEV (DEBUG)、TEST 和 PROD (RELEASE)
对于其他对上述评论感到困惑的人,未经编辑的答案想知道是否定义了 RELEASE
R
Ronan Boiteau

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

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

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

标有“条件编译符号”的文本框

标有“定义调试常量”的复选框

标有“定义跟踪常数”的复选框

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

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

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


P
Pop Catalin

没有。

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

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

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

项目属性 -> 构建

选择发布模式

在条件编译符号文本框中输入:RELEASE


发现这非常有用,因为我现在为我的发布配置定义了一个 RELEASE 常量,为我的测试配置定义了一个 TESTING 常量。对于定义 require https 仅适用于版本 #if (RELEASE) [RequireHttps] #endif 非常有用
R
Ronan Boiteau

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

例子:

#if !DEBUG
SendTediousEmail()
#endif

P
Pete H.

我以前从未见过……但我见过:

#if (DEBUG == FALSE)

#if (!DEBUG)

那为你工作?


预处理器符号在 C# 中没有值;它们只是“定义”或“未定义”。所以只有 ! 运算符可以工作,就像你的第二个例子一样。
根据 MSDN,您可以使用 == 之类的运算符来测试真假。 msdn.microsoft.com/en-us/library/4y6tbswk.aspx
R
Ronan Boiteau

您可以为此目的使用 #if(!DEBUG)


对我来说很好的保存是想在 xamrian 中使用它感谢发帖。
佚名

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

因此,当定义了 RELEASE 条件编译符号时,是 #if RELEASE#if (RELEASE) 的工作方式与 #if DEBUG 相同。

以下内容来自“Pop Catalin”帖子:如果要为发布配置定义 RELEASE 常量,请转到:* Project Properties -> Build * Select Release Mode * 在 Conditional compilation symbols 文本框中输入:RELEASE


F
Fetchez la vache

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

如果然后在项目属性页面的 Build 选项卡上将“条件编译符号”设置为 TEST(例如),则可以使用诸如

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

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


K
King Coffee

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

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

#define RELEASE
// or
#undef RELEASE

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

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

// or

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

J
JohnLBevan

虽然 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() 方法,同时在调试中运行以获得额外的输出。


L
Leigh

另外的选择:

#If CONFIG = "Release" Then

....

#End If

M
Matt Davison

为什么不只是

#if RELEASE
#undef DEBUG
#endif

在发布模式下,Visual Studio 没有定义名为 RELEASE 的常量。
/d:RELEASE 也可以。您还可以将其添加到发布配置(项目属性构建选项卡)下的条件编译符号。