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…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...
海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》
近日,嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》,海云安高敏捷信创白盒(SCAP)成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天,网络安全已成为企业生存与发展的核心基石,为了解…...
