C#预处理器指令

预处理指令的作用主要是向编译器发出指令,以便在程序编译开始之前对信息进行一些预处理操作。在 C# 中,预处理器指令均以 # 开头,并且预处理器指令之前只能出现空格不能出现任何代码。另外,预处理器指令不是语句,因此它们不需要以分号;结尾。

在 C# 中,预处理指令用于帮助条件编译。不同于 C 和 C++ 中的指令,在 C# 中不能使用这些指令来创建宏,而且预处理器指令必须是一行中唯一的代码,不能掺杂其它。

C# 中的预处理器指令

下表中列出了 C# 中提供的预处理器指令:

预处理器指令 描述
#define 用于定义一系列字符,可以将这些字符称为符号
#undef 用于取消一个已定义符号
#if 用于测试符号是否为真
#else 用于创建复合条件指令,与 #if 一起使用
#elif 用于创建复合条件指令
#endif 指定一个条件指令的结束
#line 用于修改编译器的行数以及(可选地)输出错误和警告的文件名
#error 用于在代码的指定位置生成一个错误
#warning 用于在代码的指定位置生成一级警告
#region 用于在使用 Visual Studio Code Editor 的大纲特性时,指定一个可展开或折叠的代码块
#endregion 用于标识 #region 块的结束

#define 预处理器

#define 预处理器指令用来创建符号常量,这个符号可以作为传递给 #if 指令的表达式,表达式将返回 true。#define 的语法格式如下:

#define symbol

【示例】下面通过示例来演示 #define 预处理器指令的使用:
#define PI
using System;

namespace c.biancheng.net
{
    class Demo
    {
        static void Main(string[] args) 
        {
            #if (PI)
                Console.WriteLine("PI 已定义");
            #else
                Console.WriteLine("PI 未定义");
            #endif
            Console.ReadKey();
        }
    }
}
运行结果如下:

PI 已定义

条件指令

您可以使用 #if 来创建条件指令,条件指令可以用于测试一个或多个符号的值是否为 true 。如果符号的值为 true,那么编译器将评估 #if 指令和下一个指令之间的所有代码。在语法上 #if 预处理器语句与 C# 中的 if 条件判断语句比较相似,如下所示:

#if symbol_1
    // 要执行的代码
#elif symbol_2
    // 要执行的代码
#else
    // 要执行的代码
#endif

其中,symbol 是要测试的符号的名称。

条件指令中仅可以使用运算符 ==(相等)和 !=(不相等)来测试布尔值 true 或 false,例如 true 表示已定义该符号。另外,还可以使用 && (and)|| (or) ! (not) 运算符来同时测试多个符号,以及使用括号对符号和运算符分组。

注意:以 #if 指令开头的条件指令必须以 #endif 指令显式结束。

下面通过示例来演示条件指令的使用:
#define DEBUG
#define VC_V10
using System;

namespace c.biancheng.net
{
    class Demo
    {
        static void Main(string[] args) 
        {
            #if (DEBUG && !VC_V10)
                Console.WriteLine("DEBUG 已定义");
            #elif (!DEBUG && VC_V10)
                Console.WriteLine("VC_V10 已定义");
            #elif (DEBUG && VC_V10)
                Console.WriteLine("DEBUG and VC_V10 已定义");
            #else
                Console.WriteLine("DEBUG and VC_V10 未定义");
            #endif
            Console.ReadKey();
        }
    }
}
运行结果如下:

DEBUG and VC_V10 已定义