当#if DEBUG运行时

42

我在我的C#类中有这段代码。

#if DEBUG
        private const string BASE_URL = "http://www.a.com/";
#else
        private const string BASE_URL = "http://www.b.com//";
#endif

我想问的是,“

”标签何时应该被使用?

#if DEBUG

代码中的路径会被执行吗?

它会在以下哪些情况下被执行:

  1. 当我在Visual Studio中运行调试会话时?
  2. 当我手动从调试文件夹中运行相关的exe或dll时?
  3. 还有其他我忘记提到的情况吗?

2
#if DEBUG 从未运行,但影响代码编译。 - Olivier Jacot-Descombes
7个回答

60

#if DEBUG是一个预处理器定义。

当您定义DEBUG常量时,它会被编译。是的,在Debug Build Configuration中,默认情况下会启用它。

Visual Studio 2010项目属性: Visual Studio 2010 Project Properties

如果选中了Define DEBUG constant,VS将编译:

private const string BASE_URL = "http://www.a.com/";

否则(未选中)VS 将会编译:

private const string BASE_URL = "http://www.b.com//";

非常好的答案。在VS2017中仍然适用。 - robnick
在我的项目中,选中或取消“定义DEBUG常量”复选框没有任何区别。任何if / else / endif语句仍将像选中复选框一样工作。有什么想法为什么会这样? - Jay
这个答案提到了如何创建一个“自定义配置”而不是“Debug”和“Release”。 - Gangula

14

这是一个预处理指令。在进行调试构建时(更具体地说,当定义了DEBUG常量时),DEBUG部分的代码将被编译。即,如果您进行调试构建,则BASE_URL将指向www.a.com。否则它将指向www.b.com。


12

Visual Studio 2017可以自动检测当前的活动配置,例如,如果选择了发布配置,它会将调试条件置灰

图片描述


3
这个整个概念的视觉呈现非常好。毕竟一张图片胜过千言万语 :) - vibs2006
1
这就是实际答案。 - Jj Rivero

9

当您使用DEBUG指令编译代码时,只有第一行会成为编译后的二进制文件的一部分。如果没有设置DEBUG指令,则第二行将成为二进制文件的一部分。

在VS中编译调试配置时,默认情况下会设置DEBUG指令,但您也可以手动为任何配置设置它。


4
这是一个“编译器指令”,这意味着它将根据您放置的#if条件在构建过程(或编译)中实际包含或排除代码。话虽如此,DEBUG符号位于项目属性中,在Visual Studio中通常会在“发布”构建时自动删除。
因此,基本上它不必在Visual Studio中以调试模式运行,并且不必在任何特定文件夹中,您的代码只是以这种方式构建。

3

如果您使用DEBUG配置进行编译,则else行之前的代码将被编译,而其他代码则不会。如果您在任何其他配置下编译,则第二行代码将被编译,而第一行则不会。


在VS项目的默认设置中,True是默认值。但是如果不使用VS或更改设置,则可能在任何配置(包括发布配置)中包含DEBUG符号。 - Rune FS

2

打开应用程序的“项目属性” ->构建选项卡。如果配置为:Active(Debug),则启用调试配置。下面的代码将输出到控制台。

#if DEBUG
    Console.WriteLine("in debug mode...");
#endif

如果配置为Active(Release),则启用Release配置。下面的代码将打印到控制台。
#if RELEASE
    Console.WriteLine("in release mode...");
#endif

如果您想在DEBUG和RELEASE模式之间切换,请使用“工具”菜单下方的“Debug / Release / Configuration Manager”下拉菜单。抱歉,大多数开发人员都知道它……但有时会被忽视,并导致上述代码无法正确运行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接