C# 预处理器指令的用法
目录
1,预处理器指令的概念2,预处理器指令的定义与使用2.1,可为空上下文2.2,定义符号2.3,条件编译2.4,定义区域2.5,错误和警告信息2.6,杂注3,预处理器指令的用途结语1,预处理器指令的概念
预处理器指令是指编译器在实际编译开始之前对信息进行预处理。通常用于简化源程序在不同的执行环境中的更改和编译。例如可以替换文本中的标记,将其他内容插入源文件,或者通过移除几个部分的文本来取消一部分文件的编译。不同于 C 和 C++ 中的指令,在 C# 中不能使用这些指令来创建宏,而且预处理器指令必须是一行中唯一的代码,不能掺杂其它。
(相关资料图)
示例如下:
#define condition // 定义 condition 字符
using System;
public class ExampleProgram
{
static void Main(string[] args)
{
#if (condition) // 测试 condition 是否为真
Console.WriteLine("condition is defined");
#else
Console.WriteLine("condition is not defined");
#endif
Console.ReadLine();
}
}
2,预处理器指令的定义与使用
在 C# 程序中,所有的预处理器指令都是以标识符 # 开始,例如 #define 和 #if,并且预处理器指令之前只能出现空格不能出现任何代码。另外,预处理器指令不是语句,因此它们不需要以分号;结尾。
2.1,可为空上下文
#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 | 将可为空警告上下文还原为项目设置。 |
代码示例:
using System;
public class ExampleProgram
{
static void Main(string[] args)
{
string? str;
#nullable disable // 将可为空注释和警告上下文设置为“已禁用”。
Console.WriteLine(str); // 报错: 使用了未赋值的局部变量“str”
#nullable enable // 将可为空注释和警告上下文设置为“已启用”。
Console.WriteLine(str);
}
}
代码界面:(PS:笔者使用的代码编辑器是 Visual Studio 2022)
2.2,定义符号
可以使用定义符号 #define 和 取消定义符号 #undef 两个预处理器指令来定义或取消定义条件编译的符号。定义符号可用于 #if 等编译指令的条件,使用 #define 来定义符号,将符号用作传递给 #if 指令的表达式。
代码示例:
#define VERBOSE // 定义符 #define
using System;
public class ExampleProgram
{
static void Main(string[] args)
{
#if VERBOSE
Console.WriteLine("详细输出版本");
#endif
}
}
代码执行结果:
详细输出版本
2.3,条件编译
可以使用以下四个预处理器指令来控制条件编译:
#if:打开条件编译,其中仅在定义了指定的符号时才会编译代码。#elif:关闭前面的条件编译,并基于是否定义了指定的符号打开一个新的条件编译。#else:关闭前面的条件编译,如果没有定义前面指定的符号,打开一个新的条件编译。#endif:关闭前面的条件编译。代码示例:
#define condition2 // 定义 condition 字符
using System;
public class ExampleProgram
{
static void Main(string[] args)
{
#if (condition)
Console.WriteLine("condition is defined");
#elif (condition2) // 测试 condition2 是否为真
Console.WriteLine("condition2 is defined");
#else
Console.WriteLine("condition is not defined");
#endif
Console.ReadLine();
}
}
代码执行结果:
csharp condition2 is defined
补充:
#if 以及 #else、#elif、#endif、#define 和 #undef 指令,允许在这些指令之间存在一个或多个符号里面包括或排除代码。其中,#if 指令开头的条件指令必须以 #endif 指令显式终止。可以使用#define 指令你定义一个符号,通过将该符号用作传递给 #if 指令的表达式。条件编译指令的用法和 C# 中的条件判断语句 if、elif 和 else 语句差不多。
2.4,定义区域
可以使用定义区域符号 #region 和 #endregion 分别表示启动区域和结束区域。这两个预处理器指令来定义可在大纲中折叠的代码区域。利用 #region 和 #endregion 指令,可以指定在使用代码编辑器的大纲功能时可展开或折叠的代码块。#region 指令后面可跟折叠区域的名称。在较长的代码文件中,折叠或隐藏一个或多个代码区域十分方便。
代码示例:
using System;
#region MyClass definition
public class ExampleProgram
{
static void Main(string[] args)
{
}
}
#endregion
折叠前:
折叠后:
2.5,错误和警告信息
可以使用错误和警告信息指令告诉编译器生成用户定义的编译器错误和警告,并控制行信息。其中包括 #error、#warning 和 #line 指令。
#error:使用指定的消息生成编译器错误。
示例如下:
using System;
public class ExampleProgram
{
static void Main(string[] args)
{
// 错误:此方法中的弃用代码。
#error Deprecated code in this method.
Console.WriteLine("This is Deprecated code");
}
}
代码界面:
#warning:使用指定的消息生成编译器警告。
示例如下:
using System;
public class ExampleProgram
{
static void Main(string[] args)
{
// 警告:此方法中的弃用代码。
#warning Deprecated code in this method.
Console.WriteLine("This is Deprecated code");
}
}
代码界面:
#line:更改用编译器消息输出的行号。
示例如下:
using System;
public class ExampleProgram
{
static void Main()
{
#line 200 "Special"
int i;
int j;
#line default
char c;
float f;
#line hidden // 编号不受影响
string s;
double d;
}
}
编译产生以下输出:
#line 200 指令将下一行的行号强制设为 200(尽管默认值为 #6);在执行下一个 #line 指令前,文件名都会报告为“特殊”。#line default 指令将行号恢复至默认行号,这会对上一指令重新编号的行进行计数。#line hidden 指令能对调试程序隐藏连续行,当开发者逐行执行代码时,介于 #line hidden 和下一 #line 指令(假设它不是其他 #line hidden 指令)间的任何行都将被跳过。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
2.6,杂注
#pragma 为编译器给出特殊指令以编译它所在的文件,这些指令必须受编译器支持。换句话说,不能使用 #pragma 创建自定义的预处理指令。
#pragma 指令的语法可定义为: #pragma
代码示例:
using System;
#pragma warning disable 414, CS3021
[CLSCompliant(false)]
public class C
{
int i = 1;
static void Main()
{
}
}
#pragma warning restore CS3021
[CLSCompliant(false)]
public class D
{
int i = 1;
public static void F()
{
}
}
代码界面:
3,预处理器指令的用途
预处理器指令的用途总结为以下几点:
有利于项目的调式和运行。例如说可以使用条件编译指令控制程序流的执行,在实际的项目中表现为多版本代码片段控制。在代码的调式阶段,可以使用错误和警告信息指令来禁止编译不属于本功能的额外代码。使用定义区域指令可以很好折叠和隐藏指定区域的代码片段。开发者可以更好的集中处理关键代码,在有着多个代码区域的项目十分的方便。结语
到此这篇关于C# 预处理器指令的用法的文章就介绍到这了,更多相关C# 预处理器指令内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
标签:
进入了发展快车道 冷链行业市场规模正在快速膨胀
2022-03-21
行业正站在风口 数字化时代在为传统的自行车产业赋能
2022-03-21
以做强实体经济支撑为重点 成都单个项目年度计划投资同比提升
2022-03-21
拥有多个国际赛事的直播版权 广州游戏电竞企业业绩向好
2022-03-21
投诉量激增 直播带货存在这么多问题的主要原因是什么?
2022-03-21
工作专班深入到各企业 春寒料峭挡不住松原市施工热情
2022-03-21
引导企业向提供“产品+服务”转变 湖南加快智能农机服务化转型
2022-03-21
创新平台建设和科技成果转化 德州加大力度重奖创新
2022-03-21
潜在风险进一步放大 商品房现房销售已是大势所趋
2022-03-21
有序复工复产 1—2月份工业经济发展新动能持续增强
2022-03-21
行业正站在风口 数字化时代在为传统的自行车产业赋能
以做强实体经济支撑为重点 成都单个项目年度计划投资同比提升
拥有多个国际赛事的直播版权 广州游戏电竞企业业绩向好
投诉量激增 直播带货存在这么多问题的主要原因是什么?
工作专班深入到各企业 春寒料峭挡不住松原市施工热情
引导企业向提供“产品+服务”转变 湖南加快智能农机服务化转型
创新平台建设和科技成果转化 德州加大力度重奖创新
潜在风险进一步放大 商品房现房销售已是大势所趋
有序复工复产 1—2月份工业经济发展新动能持续增强
多层次高频调度 1至2月河北省工业运行先行指标稳中有增
以车路协同为基础 智能交通推动城市交通绿色高质量发展
人才短板成为制约产业链高质量发展的关键节点
通过技术手段整合调配供给资源 家政行业不断提质扩容
强化产业链深层次合作 加强重大装备国产化“一条龙”模式构建
如何进一步提升纳税人缴费人的减税降费获得感?
探索建设大数据及网络安全示范试点城市有哪些积极意义?
对制造业中小微企业实施缓缴税费政策有哪些积极意义?
进一步增强自我保护意识 消费者需注意辨别谨慎消费
将“走出去”变“请进来” 西安贸易产业转移承接作用不断得到增强
厦门应如何融入“数字中国”的重大战略发展大局?
江苏省如何不断满足老人日益增长的养老服务需求?
建设一体化的职业健康信息管理平台 天津职业人群保障加强
潜力持续释放 1—2月乡村消费品市场恢复略好于城镇
直接对接社会化服务 楼宇调解室将整体提升青岛劳动争议水平
成功化解纠纷11.47万件 银保监会服务质量日趋提高
春雷响百虫出 惊蛰文化在其他方面有了进一步发展
青绿山水画在古代山水画发展史上有着怎样的影响与地位?
开播即爆款 “文化类节目收视率低”这一固有印象被推翻
涵盖了109件真迹作品 凯斯·哈林展览将持续至6月13日
- 带有一点自信的自嘲 “隔路”是另一种味道的“凡尔赛”
- 与文渊阁前后呼应 “何以中国”特展隆重致敬文化大成
- 严重者可造成暂时性失明 享受冰雪运动要注意眼睛的健康防护
- 种类繁多让人眼花缭乱 选购牛奶时需要重点关注什么?
- 网课让孩子感到不安焦虑怎么办?八问八答回应广大家长关切
- 循环系统很容易受到刺激 “倒春寒”期间老人该如何做?
- 青少年患者睡眠问题日趋增加 9条建议为孩子助眠
- 我国肥胖人群正逐年递增 不良饮食习惯是重要诱因
- 如何减少噪声对听力的损伤?这份耳部和听力保健小贴士请收好
- 强化住房限购措施 西安限购限售范围进一步扩大
- 多种方式增加供给 进一步降低新市民和青年人的居住成本
- 预计9月下旬海口可实现安居房申请网上办理
- 政策调控力度持续升级 8月百城二手房市场均价止涨转跌
- 8月中国新房找房热度依然保持平稳 环比微涨0.2%
- 进一步加强商品房销售价格备案管理 今年全国楼市调控刷新历史纪录
- 西安第二批集中供地中28宗为现场拍卖方式出让
- 细分化需求得到释放 房屋居住的属性越发凸显
- 佛山顺德龙江近日挂牌商住地起拍价约19.88亿元
- 青岛市4宗地竞品质抽签结果出炉 地溢价均约15%
- 坚持政策支持、多方参与 浙江版保障性租赁住房明确新增比例目标
- 简化审批流程 武汉将实现房源申请配租全程网上办
- 追剧为何上瘾?你追的不是剧,而是及时满足的快感
- 11月谣言在“身边”,别信这些无稽之谈
- 不会融化的“果冻冰块”研制成功 有望改变食物冷藏方式
- 对症下药“十年痼疾”,“茶博士”帮老茶园重焕生机
- 既促进生产又保护生态他用古代农耕智慧造福现代农业
- 老人被野猪咬伤 打猎者赔了5万多
- 老鼠油治烫伤致孩子进ICU 害人偏方为何被奉为灵丹妙药
- “逆行”考研=集体滑落?这结论该慎下
- 试行“家长学校”“持证上岗”?可以引导但不宜“法外加槛”
- “布鞋奶奶”走了 曾亲自给部队子弟兵送鞋40年
- 北京道路停车支持ETC无感支付
- 北京五道口增设行人信号灯四面全绿时段
- “法不责众”不是健走团“占道”的护身符
- 北京:建议研考考生考前14天在京备考
- 北京市2022年民生实事邀市民投票
- 将“干部”当店名 这个口子不能开
- 北京:242辆京牌小客车参加司法处置
- 吸氢气就能抗癌又防衰?最新“科学”流言榜发布
- 北京:保障在校体育锻炼1小时获较高认可
- 世界艾滋病日:关于艾滋病,我想和你聊聊
- 故宫博物院2022年年票紧急停售 恢复销售时间将另行公告
- 云南磨憨边检站中老边境缴毒逾4公斤
- 内蒙古满洲里公布55例本土确诊病例行动轨迹
- 满洲里高风险地区增至6个 中国内地新冠疫苗接种超25亿剂次
- 广州长隆举办“猿猴特展” 稀有“夜猴”首秀
- 四川绵竹首次拍摄到野生大熊猫标记行为 划定领地或吸引异性
- 福建福州海警局利用无人机成功查获一起非法采矿案
- 北京海关今年已查获2700余批次涉嫌侵权商品
- 安徽合肥警方严打食药环知森领域违法犯罪 侦破重特大案件14起
