当前位置: 首页 > news >正文

【.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

相关文章:

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

【.NET Core】C#预处理器指令 文章目录 【.NET Core】C#预处理器指令一、概述二、可为空上下文(#nullable)三、条件编译2.1 定义DEBUG是编译代码2.2 未定义MYTEST时,将编译以下代码 四、定义符号五、定义区域六、错误和警告信息 一、概述 预…...

自定义类型详解(2)

文章目录 5. 通讯录的实现 5. 通讯录的实现 实现一个通讯录: 通讯录中保存人的信息: 名字年龄性别电话住址 通讯录中可以存放100个人的信息增加联系人删除指定联系人修改指定联系人查找指定联系人显示所有联系人的信息排序功能 首先,我们需要…...

Python 网络爬虫入门详解

什么是网络爬虫 网络爬虫又称网络蜘蛛,是指按照某种规则在网络上爬取所需内容的脚本程序。众所周知,每个网页通常包含其他网页的入口,网络爬虫则通过一个网址依次进入其他网址获取所需内容。 优先申明:我们使用的python编译环境为PyCharm 一、首先一个网络爬虫的组成结构…...

记一次 .NET某收银软件 非托管泄露分析

一:背景 1. 讲故事 在我的分析之旅中,遇到过很多程序的故障和杀毒软件扯上了关系,有杀毒软件导致的程序卡死,有杀毒软件导致的程序崩溃,这一篇又出现了一个杀毒软件导致的程序非托管内存泄露,真的是分析多…...

C++力扣题目131--分割回文串

131. 分割回文串 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 示例 1: 输入:s "aab" 输出:[["a&qu…...

vue脚手架

● vue是单⻚⾯应⽤程序 ● 什么是路由 ○ 后端路由 ■ 对于普通的⽹站,所有的超链接都是URL地址,所有的URL地址都对应服务器上对应的资源 ○ 前端路由 ■ 对于单⻚⾯应⽤程序来说,主要通过URL中的hash ( # 号) 来实现不同⻚⾯之间的切换…...

Monorepo-uniapp 构建分享

Monorepo uniapp 构建灵感:刚好要做一个项目,于是想到升级一下之前自己写的一个vue3tspiniauno的模版框架,其实那个框架也不错;只是感觉还差点东西,我已经用那个小框架写了两三个项目;轻巧实用。为什么选…...

django后台登录:Forbidden (403) CSRF verification failed. Request aborted.

如果您在尝试登录Django后台时遇到了CSRF验证失败的错误,这通常意味着您的浏览器未能提交正确的CSRF令牌,或者Django后端未能验证该令牌。遵循以下步骤来解决这个问题: 清除浏览器Cookies和缓存: 有时候,浏览器的Cooki…...

【Python数据可视化】matplotlib之绘制常用图形:折线图、柱状图(条形图)、饼图和直方图

文章传送门 Python 数据可视化matplotlib之绘制常用图形:折线图、柱状图(条形图)、饼图和直方图matplotlib之设置坐标:添加坐标轴名字、设置坐标范围、设置主次刻度、坐标轴文字旋转并标出坐标值matplotlib之增加图形内容&#x…...

Python从入门到精通秘籍五

Python速成,每日持续更新,知识点超详细,涵盖所有Python重难点知识及其对应代码,利用碎片化时间,实现Python从入门到精通的飞跃!!! 一、Python的函数基本定义语法 当定义一个函数时,我们使用关键字def,后跟函数名称和一对圆括号。在圆括号内,可以指定任意数量的参数…...

MySQL 基于 GTID 主从复制

GTID 定义 GTID 是 MySQL 事务标识,为每一个提交的事务都生成一个标识,并且是全局唯一的,这个特性是从 MySQL5.6 引进的。 组成 GTID 是由 UUID TID,UUID 是MySQL的唯一标识,每个MySQL实例之间都是不同的。TID是代表…...

Linux操作系统基础

目录 计算机存储结构 冯.诺依曼结构 操作系统 在前几期我们学写了linux中常见的一些指令,本期我们将正式进行linux操作系统的学习。 计算机存储结构 要学习linux操作系统,我们就得先进行计算机存储结构的学习,要进行计算机存储结构的学…...

docker 批量更改镜像标签

docker 批量更改镜像标签 批量更改镜像标签批量删除镜像 批量更改镜像标签 docker images | grep "registry.aliyuncs.com\/google_containers" | sed s/registry.aliyuncs.com\/google_containers/registry.k8s.io/ | awk {print "docker tag "$3" …...

js 校验 大于等于0小于等于100

如果你想要在JavaScript中校验一个数值是否在0到100之间&#xff08;包括0和100&#xff09;&#xff0c;你可以使用以下的函数&#xff1a; function validateRange(value) {return value > 0 && value < 100; }你可以使用这个函数来检查一个值是否在指定的范围…...

前端面试题-webpack

1.webpack是什么&#xff1f; 模块打包工具&#xff0c;用于将前端资源&#xff0c;如JavaScript、css、图片等打包成可以在浏览器运行的静态资源。可以将多个模块打包成一个或多个bundle。 主要功能&#xff1a; 模块化&#xff1a;可以将多个模块打包成一个或多个bundle&…...

What is `WebMvcConfigurer` does?

WebMvcConfigurer 用于自定义和扩展SpringMVC的功能配置。 比如&#xff1a;可以配置如视图解析器、静态资源处理、消息转换器、拦截器等MVC相关的组件。 实现 WebMvcConfigurer 接口&#xff0c;并使用 Configuration 注解标记&#xff0c;使其成为一个配置类 Configuration …...

安全强化学习笔记

这里写自定义目录标题 参考资料 Safe Reinforcement Learning环境算法CPO 2017 ICMLPCPO 2019 ICLRFOCOPS 2020 NIPSCRPO 2021 ICMLCUP 2022 NIPS TRPO 如何看懂TRPO里所有的数学推导细节? - 小小何先生的回答 - 知乎 参考资料 Safe Reinforcement Learning 安全/约束强化学…...

POI-tl 知识整理:整理1 -> 利用模板向word中写入数据

1 文本传值 Testpublic void testText() throws Exception {XWPFTemplate template XWPFTemplate.compile("D:\\Idea-projects\\POI_word\\templates.docx");Map<String, Object> map new HashMap<>();map.put("title", "Hi, girl"…...

PDF结构详解

文章目录 介绍前言高保真的文件什么是PDF&#xff1f;PDF的一些优点版本摘要谁在使用PDF&#xff1f;有用的免费软件谁应该阅读 构建一个简单PDF文件基本PDF语法File StructureDocument ContentPage Content 构建简单PDF文件头目录&#xff0c;交叉引用表和文件尾主要对象图形内…...

Three.js 镜面反射Reflector 为MeshStandardMaterial增加Reflector能力

效果效果官方案例 区别&#xff1a;官方的案例更像一个镜子 没有纹理等属性 也没有透明度修改 根据源码进行修改为 MeshStandardMaterial实现反射 使用案例 createReflector() {const plane this.helper.create.plane(2, 2);this.helper.add(plane.mesh);plane.mesh.rotat…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

Python 训练营打卡 Day 47

注意力热力图可视化 在day 46代码的基础上&#xff0c;对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

土建施工员考试:建筑施工技术重点知识有哪些?

《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目&#xff0c;核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容&#xff0c;附学习方向和应试技巧&#xff1a; 一、施工组织与进度管理 核心目标&#xff1a; 规…...