微商城网站建设市场,网站建设的风险分析,网站建设哪家最好用,wordpress创建网站【.NET Core】C#预处理器指令 文章目录 【.NET Core】C#预处理器指令一、概述二、可为空上下文#xff08;#nullable#xff09;三、条件编译2.1 定义DEBUG是编译代码2.2 未定义MYTEST时#xff0c;将编译以下代码 四、定义符号五、定义区域六、错误和警告信息 一、概述
预…【.NET Core】C#预处理器指令 文章目录 【.NET Core】C#预处理器指令一、概述二、可为空上下文#nullable三、条件编译2.1 定义DEBUG是编译代码2.2 未定义MYTEST时将编译以下代码 四、定义符号五、定义区域六、错误和警告信息 一、概述
预处理器指令是指编译器在实际编译开始之前对信息进行预处理。通常是简化源程序在不同的环境中运行。尽管编译器没有单独的预处理器但是本文所说的指令的处理方式与有预处理器时一样。可以使用这些指令来帮助条件编译。不同于C和C指令不能使用这些指令来创建宏。预处理器指令必须是一行中唯一的说明。
二、可为空上下文#nullable
#nullable 预处理器指令将设置可为空注释上下文和可为空警告上下文 。 此指令控制是否可为空注释是否有效以及是否给出为 Null 性警告。 每个上下文要么处于已禁用状态要么处于已启用状态 。
可在项目级别指定这些两个上下文。#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将可为空警告上下文还原为项目设置。
三、条件编译
使用四个预处理器指令来控制条件编译
#if打开条件编译其中仅在定义了指令的符号时才会编译代码。#elif关闭前面的条件编译并基于是否定义了指定的符号打开一个新的条件编译。#else关闭前面的条件编译如果没有定义前面指定的符号打开一个新的条件编译。#endif关闭前面的条件编译。
仅在定义指定的符号时或者在使用!not运算符时未定义指定的符号时C#编译器才编译#if指令和#endif指令之间的代码。C#中的#if语句是布尔值且仅测试是否已定义该符号。
2.1 定义DEBUG是编译代码
#if DEBUGConsole.WriteLine(Debug version);
#endif 2.2 未定义MYTEST时将编译以下代码
#if !MYTESTConsole.WriteLine(MYTEST is not defined.);
#end if可以使用运算符(相等)和!(不相等)老测试bool值是true还是false。true表示定义该符号。语句#if DEBUG具有与#if (DEBUG true)相同的含义。可以使用(and) 、||(or)和!(not)运算符来计算是否已定义多个符号。还可以用括号对符号和运算符进行分组。
#if 以及 #else、#elif、#endif、#define 和 #undef 指令允许基于是否存在一个或多个符号包括或排除代码。 条件编译在编译调试版本的代码或编译特定配置的代码时会很有用。
以 #if 指令开头的条件指令必须以 #endif 指令显式终止。
#elif 可以创建复合条件指令。 如果之前的 #if 和任何之前的可选 #elif 指令表达式的值都不为 true则计算 #elif 表达式。 如果 #elif 表达式计算结果为 true编译器将计算 #elif 和下一条件指令间的所有代码。
四、定义符号
使用以下两个预处理器指令来定义或取消定义条件编译的符号
#define定义符号#undef取消定义符号
使用 #define 来定义符号。 将符号用作传递给 #if 指令的表达式时该表达式的计算结果为 true
#define GOYEER
#if GOYEERConsole.WriteLine(Verbose output version);
#endif #define 指令不能用于声明常量值这与 C 和 C 中的通常做法一样。 C# 中的常量最好定义为类或结构的静态成员。 如果具有多个此类常量请考虑创建一个单独的“常量”类来容纳它们。
五、定义区域
可以使用以下两个预处理器指令来定义可在大纲中折叠的代码区域
#region启动区域。#endregion结束区域
利用#region可以指定在使用代码编辑器的大纲功能时可展开或折叠的代码块。在较长的代码文件中折叠或隐藏一个或多个区域十分便利。
#region GoYeerClass definition
public class GoYeerClass
{static void Main(){}
}
#endregion#region 块必须通过 #endregion 指令终止。 #region 块不能与 #if 块重叠。 但是可以将 #region 块嵌套在 #if 块内或将 #if 块嵌套在 #region 块内。
六、错误和警告信息
使用以下指令指示编译器生成用户定义的编译器错误和警告并控制行信息
#error使用指定的消息生成编译器错误。#warning使用指定的消息生成编译器警告。#line更改用编译器消息输出的行号。
class MainClass
{static void Main(){
#line 200 Specialint i;int j;
#line defaultchar c;float f;
#line hidden // numbering not affectedstring s;double d;}
}控制台输出结果
Special(200,13): warning CS0168: The variable i is declared but never used
Special(201,13): warning CS0168: The variable j is declared but never used
MainClass.cs(9,14): warning CS0168: The variable c is declared but never used
MainClass.cs(10,15): warning CS0168: The variable f is declared but never used
MainClass.cs(12,16): warning CS0168: The variable s is declared but never used
MainClass.cs(13,16): warning CS0168: The variable d is declared but never used