C#如何使用#if为调试和发布提供不同的编译结果?

时间:2010-02-09 19:53:51

标签: c#

在C ++中,我们可以使用#ifdef在发布时消除一些调试语句。 C#与预处理器中的C ++不同。我仍然可以使用C ##if获得相同的结果。我们希望通过更改一个地方来消除所有调试语句,并且我们有几种不同类型的调试语句。可以有一个包含所有#ifdef标志的文件来打开或关闭那些调试语句吗?感谢

3 个答案:

答案 0 :(得分:20)

您可以将代码打包在:

#if DEBUG

// debug only code

#endif

但是,我不建议这样做。它通常是一个更好的替代方法,只需创建一个方法并使用[Conditional("DEBUG")]属性标记它。有关详细信息,请参阅Conditional on MSDN。这允许您只进行调试方法:

[Conditional("DEBUG")]
public void DebugPrint(string output) { // ... 
}

然后,你可以正常调用它:

DebugPrint("Some message"); // This will be completely eliminated in release mode

答案 1 :(得分:4)

使用类似:

#if DEBUG

System.Console.WriteLine("This is debug line");

#endif

答案 2 :(得分:2)

根据MSDN docs

  

使用#define创建的符号范围是定义它的文件。

因此,您无法拥有一个文件来定义整个程序中使用的其他几个定义。最简单的方法是在项目文件上使用不同的配置,并在命令行上为编译器指定每个配置的定义列表。

<强>更新 您可以通过右键单击项目并选择属性,在Visual Studio中设置项目定义。然后选择构建标签。通常,您可以在“条件编译符号”下指定要发送到编译器的定义。您可以使用Configuration Manager(Build-&gt; Configuration Manager)

定义不同的项目设置

更新2: 当指定“条件编译符号”时,Visual Studio在编译器的命令行上发出/define(C#的csc.exe),您可以通过在构建项目时检查输出窗口来查看。来自MSDN docs for csc.exe

  

/ define选项具有相同的效果   使用#define预处理器   指令除了编译器   选项对于中的所有文件都有效   该项目。符号仍然定义   在源文件中直到#undef   源文件中的指令删除   定义。当你使用   / define选项,一个#undef指令   一个文件对其他来源没有影响   项目中的代码文件。

     

您可以使用由此创建的符号   选项#if,#else,#elif和   #endif有条件地编译源文件。