我有一个使用Visual Studio 2010构建的C#应用程序。为了帮助我完成应用程序中的一些例行任务,我想在调试模式下编译应用程序时设置一些值。当然,我虽然预处理器指令是个好主意。我的问题是,我不太明白如何使用它们。这时,我有一段代码如下:
#define DEBUG
... // Other code in my app
#if DEBUG
myVariable = debugValue;
#endif
我的问题是,当我在发布模式下编译我的应用程序时,myVariable仍然设置为debugValue。这就像我没有正确定义我的预处理器变量或我没有正确配置我的编译器。任何人都可以向我解释我需要做什么,以便在调试模式下编译应用程序时myVariable仅设置为debugValue?
谢谢!
答案 0 :(得分:11)
如果您使用#define DEBUG
指定调试符号,切换到发布模式仍将提供符号,因为您明确定义了它。
尝试删除代码文件中的#define DEBUG
行。默认情况下,VS在调试模式下定义DEBUG
和TRACE
,在发布模式下定义TRACE
,因此无需明确定义它们。
答案 1 :(得分:9)
如果您不了解,可能需要查看"Conditional" attribute。这使您可以修饰方法而不是内联预处理程序指令:
class SomeClass
{
public void ProductionOperation()
{
//Doin' production stuff
Log(someProductionVariable);
}
[Conditional("DEBUG")]
public static void Log(string message)
{
//Write to a file
}
}
如果您正在调试模式下编译,则log方法将写入文件。如果您在发布模式下进行编译,则条件方法将变为无操作。这里唯一要记住的是条件代码将使它成为你的程序集,不像你用预处理器抢占它 - 这是运行时的区别。但是,只要您不介意,我发现这可以使代码更清晰。
(如果您要这样做,您不希望在代码中的任何位置#defining或#undefining DEBUG变量。)
答案 2 :(得分:5)
DEBUG常量实际上是在项目属性中定义的。转到项目属性 - >构建选项卡 - >定义DEBUG常量。
通过明确声明该常量,您将覆盖VS声明的那个。
答案 3 :(得分:4)
只是为凯尔和史蒂夫的答案添加一点......
如果使用文本编辑器打开.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已经提到的,您的代码基本上将其添加到所有配置中。