c#的预处理器用于帮助条件编译,但是不同于C和C++指令,不能用于创建宏定义。
参考:
C# preprocessor directives
Conditional Compilation in Visual Basic
Visual Studio 文档 “项目设计器”->“生成”页 (C#)
C# 编译器选项
文章目录
声明编译常量
有三种方式可以设置条件编译常量:
设置常量方式 | 常量的作用域 |
---|---|
在Visual Studio项目设计器中 | 整个项目 |
使用命令行编译器时在命令行中(C# 编译器选项) | 编译的整个项目 |
在代码文件中(#define) | 代码所在的文件 |
Visual Studio设置编译常量
项目=>属性=>生成=>常规=>条件编译符号
勾选“定义 DEBUG 常量”、“定义 TRACE 常量”后会自动定义DEBUG、TRACE编译常量。
其他需要的编译常量可在“条件编译符号”中输入,以“;”分隔。
预定义编译常量
.Net 不同框架自带的预定义编译常量
目标框架 | 符号 |
---|---|
.Net Framework | NET20,NET35,NET40,NET45,NET451,NET452,NET46,NET461,NET462,NET47,NET471,NET472 |
.NET Sandard | NETSTANDARD1_0, NETSTANDARD1_1, NETSTANDARD1_2, NETSTANDARD1_3, NETSTANDARD1_4, NETSTANDARD1_5, NETSTANDARD1_6, NETSTANDARD2_0 |
.NET Core | NETCOREAPP1_0, NETCOREAPP1_1, NETCOREAPP2_0, NETCOREAPP2_1, NETCOREAPP2_2 |
预处理器指令
#if、#else、#elif、#endif
c#的#if、#else、#elif的条件语句是布尔值,仅判断是否已定义该符号,支持“==、!=、&&、||、!”等运算符号,例如:
static void Main(string[] args)
{
#if DEBUG
Console.WriteLine("this is debug mode");
#endif
#if (DEBUG == true)
Console.WriteLine("this is debug mode");
#endif
#if (DEBUG != true)
Console.WriteLine("this is not debug mode");
#endif
}
#if必须以#endif指令终止,#if与#endif之间的代码块为条件编译内容。
#else、#elif与#if一起使用,#else后必须是#endif。
一行只能有一个预处理器指令。
#define、#undef
#define用来定义编译常量符号。
#define指令不能用来声明常量值。
常量符号可用于#if、#elif指定编译的条件,还可以使用ConditionalAttribute来执行条件编译。
#undef用来取消定义符号,使定义的编译常量失效。
#define、#undef必须放在文件顶部。
#warning、#error
#warning用来生成 CS1030 第一级编译器警告。
#error用来生成 CS1029 用户定义的错误。
static void Main(string[] args)
{
#warning 这是一个自定义的编译警告
#error 这是一个自定义的编译错误
}
#line
#line可强制设置行号
static void Main(string[] args)
{
Console.WriteLine("Normal line #1.");
#line hidden // 隐藏行,在以下两行设置断点将不会生效
Console.WriteLine("Hidden line.");
Console.WriteLine("Hidden line.2");
#line default
Console.WriteLine("Normal line #2.");
// 强制下一行号为200,文件名为SpecialFilename
#line 200 "SpecialFilename"
int i;
int j;
// 设为默认的原始行号
#line default
char c;
float f;
}
#region #endregion
用于折叠代码块,在单文件代码量比较多的时候非常有用。
#pragma、#pragma warning、#pragma checksum
#pragma为编译器给出特殊指令以编译它所在的文件。 这些指令必须受编译器支持。不可使用 #pragma 创建自定义处理指令。 Microsoft C# 编译器支持以下两种 #pragma 指令:
#pragma warning
#pragma checksum
语法:
#pragma pragma-name pragma-arguments
#pragma warning 可以启用或禁用特定警告。
#pragma checksum为源文件生成校验和,以帮助调试校验 ASP.NET 页。