在Visual Studio 2010中使用C#预处理指令

6

我正在使用Visual Studio 2010构建一个C#应用程序。为了帮助我完成一些例行任务,我想在调试模式下设置一些值。自然而然地,我认为预处理器指令是个好主意。但问题是,我不太明白如何使用它们。目前,我的代码块看起来像这样:

#define DEBUG

... // Other code in my app

#if DEBUG
  myVariable = debugValue;
#endif

我的问题是,当我以发布模式编译我的应用程序时,myVariable仍然被设置为debugValue。就像我没有正确定义预处理器变量或没有正确配置编译器一样。有没有人能够解释一下我需要做什么才能使myVariable仅在以调试模式编译应用程序时设置为debugValue?

谢谢!

4个回答

11
如果您使用#define DEBUG来指定调试符号,那么切换到发布模式仍将提供该符号,因为您已明确定义了它。
尝试在代码文件中删除#define DEBUG行。默认情况下,VS在调试模式下定义DEBUGTRACE,在发布模式下定义TRACE,因此不必显式定义它们。

9

如果您还不知道,那么您可能需要查看“条件”属性。它可以让您装饰一个方法而不是内联预处理器指令:

class SomeClass 
{
   public void ProductionOperation()
   {
      //Doin' production stuff
       Log(someProductionVariable);
   }

   [Conditional("DEBUG")]
   public static void Log(string message) 
   {
       //Write to a file
   }
}

如果你在调试模式下编译,log方法将会写入文件。如果你在发布模式下编译,条件方法将变成一个空操作。唯一需要记住的是,条件代码将进入你的汇编代码中,不像使用预处理器可以防止这种情况-这是运行时的区别。但是,只要你不介意,我发现这样可以使代码更清晰。
(如果你要这样做,你不会希望在你的代码中任何地方定义或取消定义DEBUG变量)。

5

DEBUG常量实际上是在您的项目属性中定义的。转到项目属性->构建选项卡->定义DEBUG常量。

通过明确声明该常量,您将覆盖VS声明的常量。


4

补充一下Kyle和Steve的回答:

如果您使用文本编辑器打开.csproj文件,您可以看到配置的Debug和Release如何定义符号。

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
    ...
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    ...
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
    ...
    <DefineConstants>TRACE</DefineConstants>
    ...
  </PropertyGroup>

活动配置是通过以下设置的

<Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>

但正如Kyle所提到的,你的代码实际上将其添加到了所有配置中。

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