当#if DEBUG运行时

我在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. 我忘记提及的任何其他情况?

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

它在您定义DEBUG常量时编译。 是的,它是Debug Build Configuration的默认设置。

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

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

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

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

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

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

使用DEBUG指令编译时。 因此,如果设置它,则只有第一行将是已编译二进制文件的一部分,如果未设置,则第二行将成为二进制文件的一部分。

在VS中编译调试配置时默认设置DEBUG,但您可以手动为任何配置设置DEBUG

这是一个“编译器指令”,这意味着它实际上将根据您输入的#if包括或排除构建过程(或编译)中的代码。也就是说,DEBUG符号位于项目的属性中,在Visual Studio中通常会在“Release”版本中自动删除。

所以基本上,它不必在Visual Studio中运行调试,并且它不必在任何特定文件夹中,您的代码就是以这种方式构建的。

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

VS 2017实际上感知了活动配置,例如,如果选择了发布配置,则会使调试条件变灰

在此处输入图像描述

转到应用程序的“项目属性” – >“构建”选项卡。 如果配置:活动(调试),则启用调试配置。 下面的代码将打印到控制台。

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

如果配置:活动(释放),则启用发布配置。下面的代码将打印到控制台。

 #if RELEASE Console.WriteLine("in release mode..."); #endif 

如果你想在DEBUG和RELEASE模式之间切换,请使用工具菜单下的“调试/发布/配置管理器”下拉菜单。大多数开发人员都知道这种情况…但有时会被忽略并导致混淆为什么上面的代码是运行不正常。