【.NET Core】C#预处理器指令

【.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 "Special"int 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/628269.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【深度学习】动手学深度学习(PyTorch版)李沐 2.4.3 梯度【公式推导】

2.4.3. 梯度 我们可以连接一个多元函数对其所有变量的偏导数,以得到该函数的梯度(gradient)向量。 具体而言,设函数 f : R n → R f:\mathbb{R}^{n}\to\mathbb{R} f:Rn→R的输入是一个 n n n维向量 x ⃗ [ x 1 x 2 ⋅ ⋅ ⋅ x n …

MySQL面试题 | 07.精选MySQL面试题

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

MyBatis-Plus代码生成器使用

这里写目录标题 第一章、添加依赖第二章、准备CodeGenerator类第三章、右键运行main方法 第一章、添加依赖 mybatis-plus-generator依赖和velocity-engine-core依赖和commons-lang3依赖加到pom文件里面&#xff0c;代码生成器会用到 <dependency><groupId>com.bao…

跟着cherno手搓游戏引擎【6】ImGui和ImGui事件

导入ImGui&#xff1a; 下载链接&#xff1a; GitHub - TheCherno/imgui: Dear ImGui: Bloat-free Immediate Mode Graphical User interface for C with minimal dependencies 新建文件夹&#xff0c;把下载好的文件放入对应路径&#xff1a; SRC下的premake5.lua文件&#…

基于STM32F103C8T6单片机的1秒定时器设计与应用

标题&#xff1a;基于STM32F103C8T6单片机的1秒定时器设计与应用 摘要&#xff1a; 本文主要探讨了如何在STM32F103C8T6微控制器上利用内部定时器实现精确的1秒钟定时功能&#xff0c;并通过实际项目实施&#xff0c;验证其稳定性和可靠性。首先介绍了STM32F103C8T6单片机的特…

k8s 存储卷和pvc,pv

存储卷---数据卷 容器内的目录和宿主机的目录进行挂载。 容器在系统上的生命周期是短暂的&#xff0c;deletek8s用控制器创建的pod&#xff0c;delete相当于重启&#xff0c;容器的状态也会回复到初始状态。 一旦回到初始状态&#xff0c;所有的后天编辑的文件的都会消失。 …

Nacos:发现微服务的未来

一、为什么要使用Nacos 在今天的数字化世界中&#xff0c;微服务架构已经成为软件开发的主流。这种架构风格将大型复杂软件拆分为一系列小型的、松耦合的服务&#xff0c;每个服务都可以独立地开发、测试、部署和扩展。然而&#xff0c;随着微服务数量的增长&#xff0c;管理…

SpringBoot教程(十六) | SpringBoot集成swagger(全网最全)

SpringBoot教程(十六) | SpringBoot集成swagger&#xff08;全网最全&#xff09; 一. 接口文档概述 swagger是当下比较流行的实时接口文文档生成工具。接口文档是当前前后端分离项目中必不可少的工具&#xff0c;在前后端开发之前&#xff0c;后端要先出接口文档&#xff0c…

202312 青少年软件编程(C/C++)等级考试试卷(三级)电子学会真题

202312 青少年软件编程&#xff08;C/C&#xff09;等级考试试卷&#xff08;三级&#xff09;电子学会真题 1.因子问题 题目描述 任给两个正整数N、M&#xff0c;求一个最小的正整数a&#xff0c;使得a和(M-a)都是N的因子。 输入 包括两个整数N、M。N不超过1,000,000。 …

Mysql-redoLog

Redo Log redo log进行刷盘的效率要远高于数据页刷盘,具体表现如下 redo log体积小,只记录了哪一页修改的内容,因此体积小,刷盘快 redo log是一直往末尾进行追加,属于顺序IO。效率显然比随机IO来的快Redo log 格式 在MySQL的InnoDB存储引擎中,redo log(重做日志)被用…

C++ 输入用户名和密码 防止注入攻击

1、问题解释&#xff1a;注入攻击 &#xff0c;无密码直接登录数据库 可视化展示 1.1、当你的数据库为&#xff1a;其中包含三个字段id user 以及md5密码 1.2、在使用C堆数据库信息进行访问的时候&#xff0c;使用多条语句进行查询 string sql "select id from t_user…

蓝桥杯基础知识5 unique()

蓝桥杯基础知识5 unique&#xff08;&#xff09; #include <bits/stdc.h>int main(){std::vector<int> vec {1,1,2,2,3,3,3,4,4,5};auto it std::unique(vec.begin(), vec.end());vec.erase(it, vec.end());//vec.erase(unique(vec.begin(),vec.end()),vec.end(…

力扣82-删除排序链表中的重复元素

删除排序链表中的重复元素 题目链接 解题思路 1.遇见相同的元素直接删除即可 2.链表的头部也可能是重复元素&#xff0c;所以需要一个哑节点res来指向链表的头节点 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* List…

机器学习之集成学习概念介绍

概念 机器学习中的集成学习(Ensemble Learning)是一种通过组合多个模型来提高整体性能的技术。它的基本思想是将多个学习器(弱学习器)组合成一个更强大的学习器,以提高整体性能和泛化能力。集成学习可以在各种机器学习任务中使用,包括分类、回归和聚类。 核心 弱学习器…

Spring自带分布式锁你用过吗?

环境&#xff1a;SpringBoot2.7.12 本篇文章将会为大家介绍有关spring integration提供的分布式锁功能。 1. 简介 Spring Integration 是一个框架&#xff0c;用于构建事件驱动的应用程序。在 Spring Integration 中&#xff0c;LockRegistry 是一个接口&#xff0c;用于管理…

使用Postman测试WebService接口

文章目录 使用Postman测试WebService接口1. 访问wsdl地址2. Postman配置1. URL及Headers设置2. Body设置3. 响应结果 使用Postman测试WebService接口 1. 访问wsdl地址 接口地址如&#xff1a;http://localhost:8101/ws/hello?wsdl 2. Postman配置 1. URL及Headers设置 2. B…

跟着小德学C++之数据库基础

嗨&#xff0c;大家好&#xff0c;我是出生在达纳苏斯的一名德鲁伊&#xff0c;我是要立志成为海贼王&#xff0c;啊不&#xff0c;是立志成为科学家的德鲁伊。最近&#xff0c;我发现我们所处的世界是一个虚拟的世界&#xff0c;并由此开始&#xff0c;我展开了对我们这个世界…

【揭秘】sleep()、wait()、park()三种休眠方式的终极对比

在Java中&#xff0c;线程休眠的三种方式包括Thread.sleep、Object.wait和LockSupport.park。Thread.sleep使线程在指定时间后进入休眠&#xff0c;状态为TIMEDWAITING&#xff0c;不会释放锁。Object.wait需在对象锁的保护下调用&#xff0c;会释放该对象的锁&#xff0c;使线…

Java SE入门及基础(13)

流程控制 1. break关键字 应用场景 break只能应用于 while 循环、 do-while 循环、 for 循环和 switch 选择结构 作用 break 应用在循环结构中时&#xff0c;表示终止 break 所在的循环&#xff0c;执行循环结构下面的代码&#xff0c;通常与 if 选择结构配合使用 …

CCS自适应巡航简介-驾驶辅助最初版本

在汽车行业这么多年&#xff0c;接触汽车也有些年头了&#xff0c;最开始接触的驾驶辅助功能就是ACC。 在这里说一说CC的来龙去脉吧~ CCS全称为CRUISE CONTROL SYSTEM&#xff0c;取的是英文首字母。以后看到CCS就要认得这是个啥&#xff1b; 到底有用处呢&#xff0c;如果你…