c# 中使用的“#if”指令是啥,“符号”代表啥?
Posted
技术标签:
【中文标题】c# 中使用的“#if”指令是啥,“符号”代表啥?【英文标题】:What is "#if" directive used for in c# and what "symbols" stand for?c# 中使用的“#if”指令是什么,“符号”代表什么? 【发布时间】:2019-04-01 07:39:56 【问题描述】:我试图了解#if
语句在 C# 上的工作原理以及它的使用方式。
看完some documentation我得出的结论是,如果定义了条件中的“符号”,它就是用来编译其中的代码的。
#if DEBUG
Console.WriteLine("Debug version");
#endif
这里的问题是我不知道他们所说的“符号”是什么意思(在这种情况下,DEBUG
),由于这个词的广泛含义,我正在努力寻找答案。
这些“符号”是什么?这些“预处理器指令”的目的是什么?
【问题讨论】:
这些是预处理器指令 这对您有帮助吗:***.com/questions/2355340/…? 【参考方案1】:正如人们已经说过的,它是一个预处理器指令。 #if DEBUG ... #endif
中的代码将有条件地编译,这取决于符号 DEBUG
是否已定义。
在这种情况下,DEBUG
只是为预处理器专门引入的一个符号名称,以便它可以区分应该或不应该编译的代码块。
您可以在项目设置中定义一个新的预处理器符号:
这里,我们一共定义了四个符号:
DEBUG
TRACE
ANOTHER_SYMBOL
YET_ANOTHER_SYMBOL
DEBUG
和 TRACE
有点特别,因为它们非常普遍。这就是为什么他们有专门的复选框。这里的术语“常数”与术语“符号”互换使用。但是,在这种特定情况下,我更频繁地听到“符号”。
另一种定义符号的方法是通过代码。您可以在 .cs 源文件的最开头添加#define
指令:
#define YET_ANOTHER_SYMBOL
【讨论】:
使用项目属性的一个优点是您可以为“发布”和“调试”构建配置使用不同的符号。【参考方案2】:这些是预处理器指令。在您的情况下,它将检查 DEBUG
符号是否定义为 #define DEBUG
然后代码段 Console.WriteLine
将被执行
#if DEBUG
Console.WriteLine("Debug version");
#endif
【讨论】:
问题似乎不是指令实际上是什么,而是在这种情况下 symbol 是什么。【参考方案3】:正如您已经假设的那样,DEBUG
-symbol 被编译器使用 来翻译或不翻译代码。因此,在发布版本中 - DEBUG
不存在 - 代码不会编译到 IL 中。
这里的符号表示引入编译器的变量。这些是在 VS Project Properties-->Build-->conditional complation symbols 中定义的。但是存在一组预定义的符号 - 例如DEBUG
。
【讨论】:
【参考方案4】:除了预定义的,你还可以在文件级别或者项目级别定义自己的条件编译符号:
https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.conditionalattribute?redirectedfrom=MSDN&view=netframework-4.7.2
例如,在文件开头键入这个来定义“CONDITION1”
#define CONDITION1
或者在项目属性-->build-->条件编译符号下定义。 在这里您还可以看到预定义的“调试”和“跟踪”常量(如果检查了您的配置)。
【讨论】:
【参考方案5】:在此上下文中的“符号”表示称为“条件编译符号”的标识符,仅对#if 指令有用。
你可以设置它们:
在 VS 中来自 Project properties->build->条件编译符号(如 @HimBromBreere 所写)请注意,常用的 DEBUG 和 TRACE 符号有复选框 从带有 -define 选项的编译器命令行 在带有#define 指令的代码中【讨论】:
以上是关于c# 中使用的“#if”指令是啥,“符号”代表啥?的主要内容,如果未能解决你的问题,请参考以下文章