第10部分 C#预处理指令
-
编译器是一种翻译程序,用于将源语言程序翻译为目标语言程序,
- 源语言程序:表示某程序设计语言写成的,C#,C++,java等
- 目标语言程序:二进制数表示的伪机器代码写的程序。
-
编译器没有单独的预处理器,但本节中所述指令的处理方式与有预处理器时一样。 这些指令用于帮助条件编译。
-
预处理指令可以让代码还没有编译之前就可以进行一些预处理判断,在Unity中会用来进行一些平台或者版本的判断,决定不同的版本或者不同的平台使用不同的代码逻辑。
10.1 #ifelifelse~endif与#define,#endef
- C# 编译器遇到 #if 指令,最终是 #endif 指令,则仅当定义指定的符号时,它才编译这些指令之间的代码。
- #define用来定义指定符号,#endif用来取消定义符号,两者需要写在using指令前最顶层。
#define MYTEST
using System;
public class MyClass
{
static void Main()
{
#if (DEBUG && !MYTEST)
Console.WriteLine("DEBUG is defined");
#elif (!DEBUG && MYTEST)
Console.WriteLine("MYTEST is defined");
#elif (DEBUG && MYTEST)
Console.WriteLine("DEBUG and MYTEST are defined");
#else
Console.WriteLine("DEBUG and MYTEST are not defined");
#endif
}
}
10.2 #warning
- #warning 允许你从代码中的特定位置生成 CS1030 第一级编译器警告。
// preprocessor_warning.cs
// CS1030 expected
#define DEBUG
class MainClass
{
static void Main()
{
#if DEBUG
#warning DEBUG is defined
#endif
}
}
10.3 #error
- #error 可从代码中的特定位置生成 CS1029 用户定义的错误
// preprocessor_error.cs
// CS1029 expected
#define DEBUG
class MainClass
{
static void Main()
{
#if DEBUG
#error DEBUG is defined
#endif
}
}
10.4 #line
- 借助 #line,可修改编译器的行号及(可选)用于错误和警告的文件名输出。
10.5 #nullable
-
#nullable 预处理器指令将设置可为空注释上下文和可为空警告上下文 。 此指令控制是否可为空注释是否有效,以及是否给出为 Null 性警告。 每个上下文要么处于已禁用状态,要么处于已启用状态 。
-
可在项目级别(C# 源代码之外)指定这两个上下文。 #nullable 指令控制注释和警告上下文,并优先于项目级设置。 指令会设置其控制的上下文,直到另一个指令替代它,或直到源文件结束为止。
-
指令的效果如下所示:
- #nullable disable:将可为空注释和警告上下文设置为“已禁用”。
- #nullable enable:将可为空注释和警告上下文设置为“已启用”。
- #nullable restore:将可为空注释和警告上下文还原为项目设置。
- #nullable disable annotations:将可为空注释上下文设置为“已禁用”。
- #nullable enable annotations:将可为空注释上下文设置为“已启用”。
- #nullable restore annotations:将可为空注释上下文还原为项目设置。
- #nullable disable warnings:将可为空警告上下文设置为“已禁用”。
- #nullable enable warnings:将可为空警告上下文设置为“已启用”。
- #nullable restore warnings:将可为空警告上下文还原为项目设置。
10.6 #region与#endregion
- 利用 #region,可以指定在使用代码编辑器的大纲功能时可展开或折叠的代码块。 在较长的代码文件中,能够折叠或隐藏一个或多个区域会十分便利,这样,可将精力集中于当前处理的文件部分。
#region MyClass definition
public class MyClass
{
static void Main()
{
}
}
#endregion
- #region 块必须通过 #endregion 指令终止。
- #region 块不能与 #if 块重叠。 但是,可以将 #region 块嵌套在 #if 块内,或将 #if 块嵌套在 #region 块内。
10.7 #pragma
- #pragma 为编译器给出特殊指令以编译它所在的文件。 这些指令必须受编译器支持。 即是说,不可使用 #pragma 创建自定义处理指令。
- #pragma warning 可以启用或禁用特定警告。
- #pragma checksum 生成源文件的校验和以帮助调试 ASP.NET 页面。