当前位置: 首页 > 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…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…...

基于鸿蒙(HarmonyOS5)的打车小程序

1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...