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

24.8.14 《CLR via C#》 笔记12

第十五章 枚举类型和位标志

  1. 使用枚举类型而不是硬编码的理由:枚举类型更易编写,阅读和维护;枚举类型是强类型
  2. 枚举类型是值类型,不能定义任何方法,属性或事件,可利用扩展方法向枚举类型添加方法
  3. 枚举类型定义的值是常量值,枚举类型实际是一个结构,其中定义了一组常量字段和一个实例字段(value__)
  4. 枚举类型都有一个基础类型,容纳枚举类型的值(int,byte,short等)
  5. C#编译器将枚举类型视为基元类型,所以可用操作符(==,+,&等),实际作用于value__字段;枚举类型可以显式转换成不同的枚举类型
  6. ToString方法把枚举类型的实例值映射为字符串表示,可选用格式G常规,D十进制,X十六进制;同时支持Format方法格式化
  7. Enum.GetValues和Type.GetEnumValues返回枚举类型符号名称的数组;Enum.Parse和Enum.TryParse将符号转换成枚举类型的实例;Enum.IsDefined判断数值对于某枚举类型是否合法;Enum.ToObject将Byte,Int32等类型的实例转换成枚举类型的实例
  8. 位标志:经常使用枚举类型表示一组可组合的位标志(例如FileAttributes)
    1. 可使用[Flag]特性,调用ToString时,数值可以不再视为单独的符号,而是一组位标志的组合并返回字符串(每个枚举值都被表示为2的幂次,没有直接被定义的数值5(1+4)会返回Flag1,Flag3)
    2. Parse和TryParse可以将以逗号分隔的符号字符串转换成数值
    3. 位标志不能使用IsDefined方法
  9. 不能将方法定义为枚举类型的一部分,但是可以利用扩展方法模拟向枚举类型添加方法

第十六章 数组

  1. 数组从System.Array抽象类派生
  2. 值类型数组元素直接储存在数组内存空间中(局部变量在栈中,类成员在堆上),复制时复制的是全新的数组副本;引用类型数组存储的是指向数组元素的引用,数组元素本身在堆上,复制只会复制引用
  3. CLR不允许将值类型的数组转换为其他任何类型;引用类型数组转型要求数组维数相同,且必须存在从原类型到目标类型的隐式或显式转换
  4. Array.Copy执行浅拷贝;它能正确处理内存的重叠区域(源数组和目标数组的内存区域存在重叠,并且复制方向是从低地址到高地址时,直接复制会导致数据被覆盖)
  5. 所有数组隐式的实现IEnumerable,ICollection和IList
  6. 无论是值类型数组还是引用类型数组,在 C# 中作为参数传递时,传递的都是数组的引用
  7. 可以使用Array.CreateInstance创建下限非零的数组(不提倡使用非0基数组)
  8. 数组内部工作原理:
    1. 长度Length代表数组中的元素数量,Rank代表数组的维度
    2. 访问数组元素时会进行边界检查,unsafe代码可以关闭索引上下限检查
    3. 编译器已优化for循环中对Length的判断,不用缓存一个Length
  9. 使用stackalloc可以在栈上分配数组(分配速度快、自动释放、栈上数据彼此靠近可能提高CPU缓存利用率),但是不能将这种数组传递给大部分FCL方法,且需要打开unsafe开关
  10. 可以将数组嵌入结构(必须是值类型):使用unsafe标记结构,用fixed标记数组字段,必须是0基,元素只能是指定的几种类型之一

第十七章 委托

  1. 委托提供回调函数机制,它保证回调方法是类型安全的(非托管c/c++回调函数只是函数地址,不提供期望的参数个数、参数类型、返回值类型和调用协定等信息)
  2. 委托可以回调静态方法,也可以回调实例方法。将方法绑定到委托时,允许引用类型的协变性(方法能返回从委托的返回类型派生的类型)和逆变性(方法获取的参数可以是委托的参数类型的基类)
  3. 定义委托时,编译器定义一个继承System.MulticastDelegate的完整的类,其构造器接受一个指向目标方法的指针,以及一个可选的 object 类型的参数,用于存储目标对象 (如果目标方法是实例方法)
  4. 委托用_invocationList字段实现委托链,第一个方法添加到委托实例时,该字段被初始化,新建一个委托实例包装这个方法,并加进list中,以后再添加/移除方法,都会合并这个list
  5. 调用委托时,会遍历_invocationList数组,由于是顺序调用,当其中一个委托对象阻塞或者抛出异常,都会影响到后续的所有对象。可以使用GetInvocationList方法显式调用每一个委托
  6. 由于定义的每个委托都会生成新的类,不建议定义太多,建议使用泛型委托Action和Func
  7. C#的为委托语法糖
    1. 不需要构造委托对象,只要提供方法名
    2. 不需要定义回调方法,可以使用Lambda表达式
    3. 局部变量不需要手动包装到类中即可传给回调方法(这使局部变量延长了生命周期)
  8. 使用反射:MethodInfo.CreateDelegate方法在运行时动态地创建一个委托,将该委托绑定到指定的静态方法或实例方法;Delegate.DynamicInvoke方法可以调用委托对象的回调方法,传递一组在运行时确定的参数

第十八章 定制特性

  1. 定制特性是一个类型的实例,从抽象类System.Attribute派生,应用时允许省略Attribute后缀
  2. 特性的构造器参数称为定位参数;还可以添加设置公共字段属性的参数,称为命名参数
  3. 定义自己的特性类,类名Attribute后缀不是必须的;至少要包含一个公共构造器;这个类应该只提供状态信息,包含字段和属性,但是不应提供方法、事件或其它成员
  4. 在特性上可以应用特性System.AttributeUsageAttribute,指明特性的合法应用范围(AttributeTargets),能不能被多次应用于同一个目标(AllowMultiple),是否同时应用于派生类和重写的方法(Inherited)。如果没有指定,则默认可以应用于所有目标、只能应用一次、可继承
  5. 定义特性类的实例构造器、字段和属性时,只能从指定的数据类型中选择,应用特性时必须传递编译时常量表达式,可以理解为特性要被序列化元数据字节流中
  6. 特性本身除了在程序集中生成额外的元数据以外没有其它意义,必须实现一些额外的代码,利用反射检测某些目标上是否存在该特性的实例,然后执行一些代码
    1. IsDefined判断目标是否应用了特性(比较高效)
    2. GetCustomAttributes和GetCustomAttribute将创建指定特性的新实例,然后扫描元数据,用指定的值设置每个实例的字段和属性值,然后返回对特性实例的引用
    3. 若要不创建从Attribute派生的对象:先用ReflectionOnlyLoad加载程序集,然后CustomAttributeData类获取CustomAttributeData集合,每个元素都是目标的一个定制特性
  7. 除了直接检查特性类的值,还可以利用Attribute重写的Equals判断两个特性对象的类型、字段值是否一致,以移除反射的使用;还可以重写Equals和Match提供更丰富的语义
  8. 条件特性类ConditionAttribute:只当定义了指定符号的前提下,编译器才会生成特性信息(例如某些特性只应用于代码分析工具,而不停留在元数据中增大文件大小)

第十九章 可空值类型

  1. 可空值类型Nullable<T>:实现使值类型为null,但仍是值类型(比值类型本身多了一个bool字段)
  2. C#允许使用?声明和初始化:Int32? x=5等价于Nullable<Int32> x=5;支持使用操作符(一元操作符、二元操作符、相等性操作符、关系操作符);还可以重载上述操作符
  3. 空接合操作符??获取两个操作数,假如左边不为null则返回左边,否则返回右边的值,能用于值类型和引用类型,例如string s = Method1() ?? Method2() ?? “Untitled”
  4. ??操作符类似?:操作符,但是某些情况下更易读
  5. 对Nullable<T>装箱时,如果是null则返回null,否则返回T的装箱
  6. 对象拆箱为Nullable<T>时,如果对象是null则返回一个Nullable<T>并将值设为null
  7. 对Nullable<T>使用GetType(),返回T的类型
  8. 通过Nullable<T>调用接口方法,就算接口只实现了以T为参数的方法,也能通过编译

相关文章:

24.8.14 《CLR via C#》 笔记12

第十五章 枚举类型和位标志 使用枚举类型而不是硬编码的理由&#xff1a;枚举类型更易编写&#xff0c;阅读和维护&#xff1b;枚举类型是强类型枚举类型是值类型&#xff0c;不能定义任何方法&#xff0c;属性或事件&#xff0c;可利用扩展方法向枚举类型添加方法枚举类型定义…...

P2801 教主的魔法

[题目通道](教主的魔法 - 洛谷) 摘要 分块&#xff0c;是一种优雅的暴力&#xff0c;它通过对数列分段&#xff0c;完成对数列一些区间操作和区间查询的操作&#xff0c;是一种根号算法。 这篇学习笔记&题解是本萌新在学习分块过程中的一些感悟&#xff0c;希望能够帮助…...

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&#xff0c;它们都可以通过加载图片的方式获取&#xff1a;bool load(QIODevice *dev, const char *format …...

LVS原理及相关配置

1. 描述以及工作原理 1. 什么是 LVS linux virtural server 的简称&#xff0c;也就是 linxu 虚拟机服务器&#xff0c;这是一个 由章文嵩博士发起的开源项目&#xff0c;官网是 http://www.linuxvirtualserver.org,现在 lvs 已经是 linux 内核标 准的一部分&#xff0c;使用…...

webrtc一对一视频通话功能实现

项目效果 实现原理 关于原理我就不做说明&#xff0c;直接看图 WebRTC建立的时序图 系统用例逻辑 搭建环境 turn服务器&#xff1a;Ubuntu24.04搭建turn服务器 mkcert的安装和使用&#xff1a;配置https访问 必须使用https协议&#xff0c; 由于浏览器的安全策略导致的&am…...

通道(channel)传递数据的例子写一个

当然&#xff01;以下是一个简单的 Go 程序示例&#xff0c;展示了如何使用通道&#xff08;channel&#xff09;在两个 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一对一教学辅导

你好&#xff0c;我是悦创。 以下是十道有创意的while循环编程题目&#xff0c;每道题目都有一定的难度&#xff0c;适合锻炼编程逻辑和思维能力。 题目1&#xff1a;旋转字符串 描述&#xff1a;给定一个字符串&#xff0c;每次循环将字符串的第一个字符移到末尾&#xff0…...

C语言 | Leetcode C语言题解之第324题摆动排序II

题目&#xff1a; 题解&#xff1a; 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跨表查询)

目录 标题&#xff1a;贷齐乐系统最新版SQL注入&#xff08;绕过WAF可union select跨表查询&#xff09; 内容&#xff1a; 一&#xff0c;环境部署 二&#xff0c;源码分析 三&#xff0c;sql注入 总结&#xff1a; [回到顶部]&#xff08;#article_top&#xff09; 一&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.服务端展示 七、项目源码 一、项目介绍 ​大家好&#xff0c;我是执手天涯&#xff0c;…...

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灯珠的颜色&#xff0c;可以使用ESP32的WebServer库来创建一个简单的Web界面。通过这个界面&#xff0c;可以动态地控制灯珠的显示效果。 针对 五、ESP32-S3上使用MicroPython点亮WS2812智能LED灯珠并通过web控制改变灯珠颜色…...

(el-Time-Picker)操作(不使用 ts):Element-plus 中 TimePicker 组件的使用及输出想要时间格式需求的解决过程

Ⅰ、Element-plus 提供的 TimePicker 时间选择器组件与想要目标情况的对比&#xff1a; 1、Element-plus 提供 TimePicker 组件情况&#xff1a; 其一、Element-ui 自提供的 TimePicker 代码情况为(示例的代码)&#xff1a; // Element-plus 提供的组件代码: <template>…...

UIAbility组件基础(一)

一、概述 UIAbility组件是一种包含UI的应用组件&#xff0c;主要用于和用户交互。UIAbility组件是系统调度的基本单元&#xff0c;为应用提供绘制界面的窗口。一个应用可以包含一个或多个UIAbility组件。每一个UIAbility组件实例都会在最近任务列表中显示一个对应的任务。 U…...

圣女司幼幽-造相Z-Turbo实战教程:使用LoRA权重切换不同圣女造型风格

圣女司幼幽-造相Z-Turbo实战教程&#xff1a;使用LoRA权重切换不同圣女造型风格 想用AI画出不同风格的圣女司幼幽吗&#xff1f;无论是清冷神性的古风仙子&#xff0c;还是现代装扮的都市丽人&#xff0c;一个模型就能搞定。 今天要介绍的这个“圣女司幼幽-造相Z-Turbo”镜像…...

丹青识画系统C语言基础:从零实现一个简单的图像文件解析器

丹青识画系统C语言基础&#xff1a;从零实现一个简单的图像文件解析器 想用C语言做点有趣的东西&#xff0c;但又觉得控制台打印“Hello World”有点无聊&#xff1f;今天我们来点不一样的——自己动手写一个能“看懂”图片的小程序。想象一下&#xff0c;你写的代码能像丹青识…...

Zynq UltraScale+ MPSoC双核协作指南:Linux与R5裸机程序的高效通信设计

Zynq UltraScale MPSoC双核协作实战&#xff1a;构建Linux与R5裸机的高效通信系统 在异构计算架构中&#xff0c;Zynq UltraScale MPSoC凭借其独特的双核设计&#xff08;Cortex-A53应用处理器与Cortex-R5实时处理器&#xff09;成为工业控制、自动驾驶和边缘计算等领域的理想选…...

新手必看:YOLOv12官版镜像快速入门,3步完成图片检测

新手必看&#xff1a;YOLOv12官版镜像快速入门&#xff0c;3步完成图片检测 1. 为什么选择YOLOv12官版镜像&#xff1f; YOLOv12是目标检测领域的最新突破&#xff0c;它彻底改变了传统YOLO系列依赖CNN的设计思路&#xff0c;首次将注意力机制作为核心架构。相比前代版本&…...

个人信息保护合规审计中-单独同意、同意、书面同意和一揽子同意的区别

在个人信息保护法律体系中&#xff0c;"同意"是个人信息处理的核心合法性基础之一。不同类型的同意形式对应不同的法律要求和适用场景。以下从概念定义、法律依据、适用场景、形式要求及实践要点五个维度进行系统分析。一、概念定义与法律依据同意类型概念定义主要法…...

基于springboot专家库评审管理系统设计与开发(源码+精品论文+答辩PPT等资料)

博主介绍&#xff1a;CSDN毕设辅导第一人、靠谱第一人、全网粉丝50W,csdn特邀作者、博客专家、腾讯云社区合作讲师、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交…...

Gemini3 AI辅助教学,轻松实现各种教学课件!

小伙们&#xff0c;今天我们来分享如何利用gemini3 pro 一句话实现教学课件打开google ai studio选择build模式输入提示词&#xff1a;做个可交互网页&#xff0c;演示串并联电路&#xff0c;要有SVG 动画&#xff0c;带公式&#xff0c;要有文字讲解&#xff0c;还要有个 AI 助…...

Visual StudioProfiler对工作流进行热点分析

热点&#xff1a;消耗了绝大部分CPU计算时间&#xff08;例如超过50%或更高比例&#xff09;的那部分代码。Visual Studio 中&#xff0c;使用性能探查器&#xff08;Profiler&#xff09;在 Visual Studio 中&#xff0c;使用性能探查器&#xff08;Profiler&#xff09;进行热…...

爬虫对抗:ZLibrary反爬机制实战分析技术文章大纲

爬虫对抗&#xff1a;ZLibrary反爬机制实战分析技术文章大纲爬虫与反爬虫概述爬虫技术的基本原理与应用场景反爬虫机制的必要性与常见手段ZLibrary作为典型案例的背景介绍ZLibrary的反爬机制分析IP限制与封禁策略请求频率检测与验证码挑战动态页面渲染与JavaScript加密用户行为…...

QGraphicView + QGraphicItem

1,rectitem->rect——item的矩形框。原点点左上角为00点 rectitem_>setTransforOriginPoint()——设置参考原点2&#xff0c;rectitem.pos()——item在scene中的位置3&#xff0c;scence的原点为左上角为00点4&#xff0c;QGraphicsView->setAlignment(Qt::AlignLef |…...