何时在.net中使用预处理程序指令?

我认为这是一个简单的问题所以我认为我错过了一些明显的东西。 我真的没有使用预处理器指令,但我正在查看某人的代码,并且认为这是我应该熟悉的东西。

所以我看了msdn示例,它有代码:

#define DEBUG // ... #if DEBUG Console.WriteLine("Debug version"); #endif 

我的两个问题是:

  • 在上面的例子中,为什么他们定义DEBUG? 如果你在debug v。发布模式下编译,我的印象是设置的?
  • 查看具有#define MYTEST的另一个示例,然后根据它是否“定义”写入控制台,但这与仅使用变量有何不同? 我在这里想念的是什么?

我实际上建议使用条件属性而不是内联#if语句。

 [Conditional("DEBUG")] private void DeleteTempProcessFiles() { } 

这不仅更清晰,更容易阅读,因为您的代码中最终没有#if,#else。 在正常的代码编辑期间以及逻辑流错误中,此样式不易出错。

通常,构造脚本将提供可选/条件编译符号。 很少看到#define ,除了非常调试代码(如果你明白我的意思)。

重新使用变量; 我经常使用这样的条件来处理必须在不同运行时运行的代码(mono,cf,silverlight等)。 变量不能满足要求,因为代码无法针对错误的平台进行编译 (缺少类型/方法等)。

在提供的示例中,我可能只使用了Debug.WriteLine ; 因为它是用[Conditional("DEBUG")]装饰的,所以如果在构建时没有定义DEBUG ,则会自动删除对它的所有调用。

在上面的例子中,为什么他们定义DEBUG? 如果你在debug v。发布模式下编译,我的印象是设置的?

可能是因为它是示例代码。 它旨在演示#ifdef和朋友的工作方式。 我不希望你在源文件中定义这样的符号,除非它是用于快速测试。

查看具有“#define MYTEST”的另一个示例,然后根据它是否“已定义”写入控制台,但这与仅使用变量有何不同? 我在这里想念的是什么?

如果在编译时未定义MYTEST,则编译器实际上不会在#if#endif块之间发出代码。 因此,所得的IL将更小。

另请注意,这些不是 C#中的预处理程序指令

如果使用变量,则编译所有代码,当使用预处理程序指令时,只有部分代码包含在executable / dll中。

我想举一个例子,我在我的项目中使用了预处理器指令。

我的程序在磁盘上创建了很多中间文件。 我使用#DEBUG指令仅在我的项目处于发布模式时删除这些文件,否则我保留这些文件以便我们可以查看这些中间文件并确定内部发生的事情。

当我的应用程序在生产服务器上工作时,我在发布模式下构建项目,以便在处理完成后删除这些文件。

 #if (DEBUG==false) deleteTempFiles() #endif 

我有一些代码在使用Mono环境而不是CLR时需要不同的处理 – 因此我的一些模块中有一个Mono指令。 我认为这是一个比调试更好的例子

我用它做了很多事情。 在调试版本中我只需要调试消息; 清理临时文件; 包括诊断function或动作。