c#中使用的“ #if”指令是什么?“符号”代表什么?

时间:2019-04-01 07:39:57

标签: c# .net preprocessor-directive

我试图了解#if语句如何在C#上工作以及如何使用。

在阅读some documentation之后,我得出的结论是,如果条件中的“符号”已定义,则可用于编译其中的代码。

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

这里的问题是我不知道“符号”(在这种情况下为DEBUG)的含义,并且由于该词的含义广泛,我一直在努力寻找答案。

这些“符号”是什么,这些“预处理程序指令”的目的是什么?

5 个答案:

答案 0 :(得分:2)

正如人们已经说过的那样,它是一个预处理程序指令。 #if DEBUG ... #endif内部的代码将有条件地编译,具体取决于是否定义了符号DEBUG

在这种情况下,DEBUG只是为预处理器专门引入的一个符号名称,以便它可以区分应该或不应该编译的代码块。

您可以在项目设置中定义一个新的预处理器符号:

Project settings dialog

在这里,我们总共定义了四个符号:

  • DEBUG
  • TRACE
  • ANOTHER_SYMBOL
  • YET_ANOTHER_SYMBOL

DEBUGTRACE之所以特别,是因为它们如此广泛。这就是为什么他们有专用的复选框。术语“常数”在此与术语“符号”可互换使用。但是,在这种特殊情况下,我会更频繁地听到“符号”。

定义符号的另一种方法是通过代码。您可以在.cs源文件的最开始处添加#define指令

#define YET_ANOTHER_SYMBOL

答案 1 :(得分:1)

这些是预处理器指令。在您的情况下,它将检查是否定义了DEBUG符号#define DEBUG,然后将执行代码段Console.WriteLine

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

答案 2 :(得分:0)

您已经假设DEBUG符号由编译器使用,以便翻译或不翻译代码。因此,在发布版本中-DEBUG不存在-代码不会编译到IL中。

此处的符号表示引入编译器的变量。这些是在“ VS项目属性”->“构建”->“条件组合符号”中定义的。但是,存在一组预定义符号-例如DEBUG

答案 3 :(得分:0)

除了预定义之外,您还可以在文件级或项目级定义自己的条件编译符号:

https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.conditionalattribute?redirectedfrom=MSDN&view=netframework-4.7.2

例如,在文件开头键入此名称以定义“ CONDITION1”

#define CONDITION1

或在项目属性下定义它们-> build->有条件的编译符号。 在这里,您还可以看到预定义的“调试”和“跟踪”常量(如果已检查配置)。

答案 4 :(得分:0)

在此上下文中,“符号”表示称为“条件编译符号”的标识符,仅对#if指令有用。

您可以设置它们:

  • 在VS中,通过Project properties-> build->条件编译符号(如@HimBromBreere所写),请注意,常用的DEBUG和TRACE符号具有复选框
  • 从编译器命令行使用-define选项
  • 在带有#define指令的代码中