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

What is "#if" directive used for in c# and what "symbols" stand for?

我正在尝试了解 #if 语句在 C# 上的工作方式及其使用方式。

看完some documentation,我得出的结论是如果定义了condition中的"symbol",就是用来编译里面的代码的。

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

这里的问题是我不知道"symbol"(在本例中为DEBUG)是什么意思,由于含义广泛,我正在努力寻找答案这个词。

这些 "symbols" 是什么,这些 "preprocessor directives" 的目的是什么?

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

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

正如您已经假设的那样,DEBUG 符号 被编译器 使用以决定是否翻译代码。所以在发布构建中 - DEBUG 不存在 - 代码没有编译成 IL。

此处的符号表示引入编译器的变量。这些在 VS Project Properties-->Build-->conditional complation symbols 中定义。但是,存在一组预定义符号 - 例如 DEBUG.

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

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

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

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

  • DEBUG
  • TRACE
  • ANOTHER_SYMBOL
  • YET_ANOTHER_SYMBOL

DEBUGTRACE 有点特殊,因为它们非常普遍。这就是为什么他们有专门的复选框。此处的术语 "constant" 可与术语 "symbol" 互换使用。但是,在这种特定情况下,我更频繁地听到 "symbol"。

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

#define YET_ANOTHER_SYMBOL

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

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

例如,在文件开头键入此内容以定义 "CONDITION1"

#define CONDITION1

或者在项目属性-->构建-->条件编译符号下定义。 在这里您还可以看到预定义的 "debug" 和 "trace" 常量(如果检查了您的配置)。

"Symbols" 在此上下文中表示称为 "conditional compilation symbols" 且仅对 #if 指令有用的标识符。

您可以设置它们:

  • 在 VS 中,项目属性->构建->条件编译符号(如@HimBromBreere 所写)请注意,有用于常用 DEBUG 和 TRACE 符号的复选框
  • 从带有 -define 选项的编译器命令行
  • 在带有#define 指令的代码中