24.8.14 《CLR via C#》 笔记12
第十五章 枚举类型和位标志
- 使用枚举类型而不是硬编码的理由:枚举类型更易编写,阅读和维护;枚举类型是强类型
- 枚举类型是值类型,不能定义任何方法,属性或事件,可利用扩展方法向枚举类型添加方法
- 枚举类型定义的值是常量值,枚举类型实际是一个结构,其中定义了一组常量字段和一个实例字段(value__)
- 枚举类型都有一个基础类型,容纳枚举类型的值(int,byte,short等)
- C#编译器将枚举类型视为基元类型,所以可用操作符(==,+,&等),实际作用于value__字段;枚举类型可以显式转换成不同的枚举类型
- ToString方法把枚举类型的实例值映射为字符串表示,可选用格式G常规,D十进制,X十六进制;同时支持Format方法格式化
- Enum.GetValues和Type.GetEnumValues返回枚举类型符号名称的数组;Enum.Parse和Enum.TryParse将符号转换成枚举类型的实例;Enum.IsDefined判断数值对于某枚举类型是否合法;Enum.ToObject将Byte,Int32等类型的实例转换成枚举类型的实例
- 位标志:经常使用枚举类型表示一组可组合的位标志(例如FileAttributes)
- 可使用[Flag]特性,调用ToString时,数值可以不再视为单独的符号,而是一组位标志的组合并返回字符串(每个枚举值都被表示为2的幂次,没有直接被定义的数值5(1+4)会返回Flag1,Flag3)
- Parse和TryParse可以将以逗号分隔的符号字符串转换成数值
- 位标志不能使用IsDefined方法
- 不能将方法定义为枚举类型的一部分,但是可以利用扩展方法模拟向枚举类型添加方法
第十六章 数组
- 数组从System.Array抽象类派生
- 值类型数组元素直接储存在数组内存空间中(局部变量在栈中,类成员在堆上),复制时复制的是全新的数组副本;引用类型数组存储的是指向数组元素的引用,数组元素本身在堆上,复制只会复制引用
- CLR不允许将值类型的数组转换为其他任何类型;引用类型数组转型要求数组维数相同,且必须存在从原类型到目标类型的隐式或显式转换
- Array.Copy执行浅拷贝;它能正确处理内存的重叠区域(源数组和目标数组的内存区域存在重叠,并且复制方向是从低地址到高地址时,直接复制会导致数据被覆盖)
- 所有数组隐式的实现IEnumerable,ICollection和IList
- 无论是值类型数组还是引用类型数组,在 C# 中作为参数传递时,传递的都是数组的引用
- 可以使用Array.CreateInstance创建下限非零的数组(不提倡使用非0基数组)
- 数组内部工作原理:
- 长度Length代表数组中的元素数量,Rank代表数组的维度
- 访问数组元素时会进行边界检查,unsafe代码可以关闭索引上下限检查
- 编译器已优化for循环中对Length的判断,不用缓存一个Length
- 使用stackalloc可以在栈上分配数组(分配速度快、自动释放、栈上数据彼此靠近可能提高CPU缓存利用率),但是不能将这种数组传递给大部分FCL方法,且需要打开unsafe开关
- 可以将数组嵌入结构(必须是值类型):使用unsafe标记结构,用fixed标记数组字段,必须是0基,元素只能是指定的几种类型之一
第十七章 委托
- 委托提供回调函数机制,它保证回调方法是类型安全的(非托管c/c++回调函数只是函数地址,不提供期望的参数个数、参数类型、返回值类型和调用协定等信息)
- 委托可以回调静态方法,也可以回调实例方法。将方法绑定到委托时,允许引用类型的协变性(方法能返回从委托的返回类型派生的类型)和逆变性(方法获取的参数可以是委托的参数类型的基类)
- 定义委托时,编译器定义一个继承System.MulticastDelegate的完整的类,其构造器接受一个指向目标方法的指针,以及一个可选的 object 类型的参数,用于存储目标对象 (如果目标方法是实例方法)
- 委托用_invocationList字段实现委托链,第一个方法添加到委托实例时,该字段被初始化,新建一个委托实例包装这个方法,并加进list中,以后再添加/移除方法,都会合并这个list
- 调用委托时,会遍历_invocationList数组,由于是顺序调用,当其中一个委托对象阻塞或者抛出异常,都会影响到后续的所有对象。可以使用GetInvocationList方法显式调用每一个委托
- 由于定义的每个委托都会生成新的类,不建议定义太多,建议使用泛型委托Action和Func
- C#的为委托语法糖
- 不需要构造委托对象,只要提供方法名
- 不需要定义回调方法,可以使用Lambda表达式
- 局部变量不需要手动包装到类中即可传给回调方法(这使局部变量延长了生命周期)
- 使用反射:MethodInfo.CreateDelegate方法在运行时动态地创建一个委托,将该委托绑定到指定的静态方法或实例方法;Delegate.DynamicInvoke方法可以调用委托对象的回调方法,传递一组在运行时确定的参数
第十八章 定制特性
- 定制特性是一个类型的实例,从抽象类System.Attribute派生,应用时允许省略Attribute后缀
- 特性的构造器参数称为定位参数;还可以添加设置公共字段属性的参数,称为命名参数
- 定义自己的特性类,类名Attribute后缀不是必须的;至少要包含一个公共构造器;这个类应该只提供状态信息,包含字段和属性,但是不应提供方法、事件或其它成员
- 在特性上可以应用特性System.AttributeUsageAttribute,指明特性的合法应用范围(AttributeTargets),能不能被多次应用于同一个目标(AllowMultiple),是否同时应用于派生类和重写的方法(Inherited)。如果没有指定,则默认可以应用于所有目标、只能应用一次、可继承
- 定义特性类的实例构造器、字段和属性时,只能从指定的数据类型中选择,应用特性时必须传递编译时常量表达式,可以理解为特性要被序列化元数据字节流中
- 特性本身除了在程序集中生成额外的元数据以外没有其它意义,必须实现一些额外的代码,利用反射检测某些目标上是否存在该特性的实例,然后执行一些代码
- IsDefined判断目标是否应用了特性(比较高效)
- GetCustomAttributes和GetCustomAttribute将创建指定特性的新实例,然后扫描元数据,用指定的值设置每个实例的字段和属性值,然后返回对特性实例的引用
- 若要不创建从Attribute派生的对象:先用ReflectionOnlyLoad加载程序集,然后CustomAttributeData类获取CustomAttributeData集合,每个元素都是目标的一个定制特性
- 除了直接检查特性类的值,还可以利用Attribute重写的Equals判断两个特性对象的类型、字段值是否一致,以移除反射的使用;还可以重写Equals和Match提供更丰富的语义
- 条件特性类ConditionAttribute:只当定义了指定符号的前提下,编译器才会生成特性信息(例如某些特性只应用于代码分析工具,而不停留在元数据中增大文件大小)
第十九章 可空值类型
- 可空值类型Nullable<T>:实现使值类型为null,但仍是值类型(比值类型本身多了一个bool字段)
- C#允许使用?声明和初始化:Int32? x=5等价于Nullable<Int32> x=5;支持使用操作符(一元操作符、二元操作符、相等性操作符、关系操作符);还可以重载上述操作符
- 空接合操作符??获取两个操作数,假如左边不为null则返回左边,否则返回右边的值,能用于值类型和引用类型,例如string s = Method1() ?? Method2() ?? “Untitled”
- ??操作符类似?:操作符,但是某些情况下更易读
- 对Nullable<T>装箱时,如果是null则返回null,否则返回T的装箱
- 对象拆箱为Nullable<T>时,如果对象是null则返回一个Nullable<T>并将值设为null
- 对Nullable<T>使用GetType(),返回T的类型
- 通过Nullable<T>调用接口方法,就算接口只实现了以T为参数的方法,也能通过编译
相关文章:
24.8.14 《CLR via C#》 笔记12
第十五章 枚举类型和位标志 使用枚举类型而不是硬编码的理由:枚举类型更易编写,阅读和维护;枚举类型是强类型枚举类型是值类型,不能定义任何方法,属性或事件,可利用扩展方法向枚举类型添加方法枚举类型定义…...
P2801 教主的魔法
[题目通道](教主的魔法 - 洛谷) 摘要 分块,是一种优雅的暴力,它通过对数列分段,完成对数列一些区间操作和区间查询的操作,是一种根号算法。 这篇学习笔记&题解是本萌新在学习分块过程中的一些感悟,希望能够帮助…...
Go 语言channel的应用场景及使用技巧
通过反映的方式执行 select 语句。这在处理有很多 case 子句,尤其是不定长 case 子句的情况时非常有用。 1. 使用反射操作 select 和 channel 使用 select 语句可以处理 chan 的 send 和 recv, send 和 recv 都可以作为 case 子句。如果需要同时处理两个 chan, 则可以写成下面…...
QLabel设置图像的方法+绘制文本换行显示
1、QLabel设置图像有两种方法 (1) void setPicture(const QPicture &); (2) void setPixmap(const QPixmap &); QPicture和QPixmap都是继承于QPaintDevice,它们都可以通过加载图片的方式获取:bool load(QIODevice *dev, const char *format …...
LVS原理及相关配置
1. 描述以及工作原理 1. 什么是 LVS linux virtural server 的简称,也就是 linxu 虚拟机服务器,这是一个 由章文嵩博士发起的开源项目,官网是 http://www.linuxvirtualserver.org,现在 lvs 已经是 linux 内核标 准的一部分,使用…...
webrtc一对一视频通话功能实现
项目效果 实现原理 关于原理我就不做说明,直接看图 WebRTC建立的时序图 系统用例逻辑 搭建环境 turn服务器:Ubuntu24.04搭建turn服务器 mkcert的安装和使用:配置https访问 必须使用https协议, 由于浏览器的安全策略导致的&am…...
通道(channel)传递数据的例子写一个
当然!以下是一个简单的 Go 程序示例,展示了如何使用通道(channel)在两个 goroutine 之间传递数据。示例代码 go package mainimport ("fmt""time" )// 发送数据到通道的 goroutine func sendData(ch chan int…...
Vue3+Echarts+饼图环形图
记得给容器宽高 <div id"leftChartguawang" style"height: 28vh"></div> 配置函数 const leftChartguawang () > {const chartBox echarts.init(document.getElementById(leftChartguawang))let datas [[{ name: 居民节能建筑, value…...
Python while编程题目|AI悦创Python一对一教学辅导
你好,我是悦创。 以下是十道有创意的while循环编程题目,每道题目都有一定的难度,适合锻炼编程逻辑和思维能力。 题目1:旋转字符串 描述:给定一个字符串,每次循环将字符串的第一个字符移到末尾࿰…...
C语言 | Leetcode C语言题解之第324题摆动排序II
题目: 题解: static inline void swap(int *a, int *b) {int c *a;*a *b;*b c; }static inline int partitionAroundPivot(int left, int right, int pivot, int *nums) {int pivotValue nums[pivot];int newPivot left;swap(&nums[pivot], &a…...
Docker③_VMware虚拟机和Docker的备份与恢复
目录 1. VMware虚拟机的快照备份 1.1 VMware本机的快照备份 1.2 VMware快照备份到另一电脑 2. Docker知识点 2.1 Docker镜像和容器的关系 2.2 Docker的存储卷 2.3 Docker命令简介 2.4 删除Anylink镜像 3. Docker备份和恢复 3.1 确定要回滚的容器和版本 3.2 备份当前…...
【EMC专题】ESD抑制器简要介绍
在ESD保护器件中可以分为陶瓷基类型和半导体基类型。其中有一类陶瓷基类型,使用的机制是电极间放电方法的产品就是ESD抑制器。本文章简要介绍了ESD抑制器的特点、基本结构和特性。 ESD抑制器的特点 ESD抑制器是间隙型的ESD(静电放电 Electrostatic Discharge)对策保护元件,…...
贷齐乐系统最新版SQL注入(绕过WAF可union select跨表查询)
目录 标题:贷齐乐系统最新版SQL注入(绕过WAF可union select跨表查询) 内容: 一,环境部署 二,源码分析 三,sql注入 总结: [回到顶部](#article_top) 一&am…...
『大模型笔记』虚拟机(Virtual Machine,VM)与Docker对比!
『大模型笔记』虚拟机(Virtual Machine,VM)与Docker对比! 文章目录 一. 虚拟机(Virtual Machine,VM)与Docker对比!1. 定义这两种技术2. 工作原理3. 关于如何选择适合工作负载的技术的指导二. 参考文献Docker 只是一个轻量级的虚拟机吗?虽然二者确实有一个共同点,即 虚…...
基于SpringBoot+Vue框架的租车管理系统
文章目录 一、项目介绍二、项目类型三、技术栈介绍1.客户端技术栈2.服务端技术栈 四、项目创新点五、项目功能介绍1.客户端功能2.服务端功能 六、项目的主要截图页面如下展示1.客户端展示2.服务端展示 七、项目源码 一、项目介绍 大家好,我是执手天涯,…...
HAProxy基本配置及参数实操
目录 编辑什么是负载均衡 为什么用负载均衡 四层和七层的区别 实验环境 实验步骤 webserver上安装nginx 启动nginx 安装haproxy 编辑配置文件 多进程 多线程 SORRY SERVER 访问重定向 maxconne最大可承受连接 socat 工具 常用示例 ha p r ox y 的 算 法 静 …...
go-zero中间件的使用
一、自定义中间件 1、在api中在服务中定义一个中间件,名字随便取 type PostDemoReq {Name string json:"name" validate:"required" // 姓名Age int64 json:"age" validate:"required,gte1,lte130" // 年龄// optional 表示可选,omi…...
六、ESP32-S3上使用MicroPython点亮WS2812智能LED灯珠并通过web控制改变灯珠颜色优化超时和线程
实现通过ESP32S3连接Wi-Fi并使用Web页面控制WS2812灯珠的颜色,可以使用ESP32的WebServer库来创建一个简单的Web界面。通过这个界面,可以动态地控制灯珠的显示效果。 针对 五、ESP32-S3上使用MicroPython点亮WS2812智能LED灯珠并通过web控制改变灯珠颜色…...
(el-Time-Picker)操作(不使用 ts):Element-plus 中 TimePicker 组件的使用及输出想要时间格式需求的解决过程
Ⅰ、Element-plus 提供的 TimePicker 时间选择器组件与想要目标情况的对比: 1、Element-plus 提供 TimePicker 组件情况: 其一、Element-ui 自提供的 TimePicker 代码情况为(示例的代码): // Element-plus 提供的组件代码: <template>…...
UIAbility组件基础(一)
一、概述 UIAbility组件是一种包含UI的应用组件,主要用于和用户交互。UIAbility组件是系统调度的基本单元,为应用提供绘制界面的窗口。一个应用可以包含一个或多个UIAbility组件。每一个UIAbility组件实例都会在最近任务列表中显示一个对应的任务。 U…...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...
毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...
