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

时间:2010-11-19 05:24:06

标签: c# .net c-preprocessor preprocessor-directive

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

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

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

我的两个问题是:

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

7 个答案:

答案 0 :(得分:17)

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

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

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

答案 1 :(得分:8)

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

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

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

答案 2 :(得分:5)

  

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

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

  

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

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

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

答案 3 :(得分:4)

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

答案 4 :(得分:4)

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

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

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

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

答案 5 :(得分:2)

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

答案 6 :(得分:1)

我已经将它用于很多事情。在调试版本中我只需要调试消息;清理临时文件;包括诊断功能或操作。