C# 预处理器指令

c#的预处理器用于帮助条件编译,但是不同于C和C++指令,不能用于创建宏定义。

参考:
C# preprocessor directives
Conditional Compilation in Visual Basic
Visual Studio 文档 “项目设计器”->“生成”页 (C#)
C# 编译器选项


文章目录

  • 声明编译常量
    • Visual Studio设置编译常量
  • 预定义编译常量
  • 预处理器指令
    • #if、#else、#elif、#endif
    • #define、#undef
    • #warning、#error
    • #line
    • #region #endregion
    • #pragma、#pragma warning、#pragma checksum


声明编译常量

有三种方式可以设置条件编译常量:

设置常量方式 常量的作用域
在Visual Studio项目设计器中 整个项目
使用命令行编译器时在命令行中(C# 编译器选项) 编译的整个项目
在代码文件中(#define) 代码所在的文件

Visual Studio设置编译常量

项目=>属性=>生成=>常规=>条件编译符号
C# 预处理器指令_第1张图片

勾选“定义 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 页。

你可能感兴趣的:(C#)