C#参考篇 第10部分 C#预处理指令

第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 页面。

上一篇:OpenCV学习笔记——颜色空间及其转化方法


下一篇:iOS Objective-C 获取api数据