C# 图解教程 第5版 —— 第14章 委托

news2024/11/26 14:48:45

文章目录

    • 14.1 什么是委托
    • 14.2 委托概述
    • 14.3 声明委托类型
    • 14.4 创建委托对象
    • 14.5 给委托赋值
    • 14.6 组合委托
    • 14.7 为委托添加方法
    • 14.8 从委托移除方法
    • 14.9 调用委托
    • 14.10 委托的示例(*)
    • 14.11 调用带返回值的委托
    • 14.12 调用带引用参数的委托
    • 14.13 匿名方法
      • 14.13.1 使用匿名方法
      • 14.13.2 匿名方法的语法
      • 14.13.3 变量和参数的作用域
    • 14.14 Lambda 表达式

14.1 什么是委托

​ 委托会执行它所“持有”的方法,可以看成是类型安全、面向对象的 C++ 函数指针。

14.2 委托概述

​ 委托是一种用户定义类型,其与类的区别可简单概括如下:

  • 类是数据和方法的集合。
  • 委托持有一个或多个方法。

​ 委托类型的声明和方法类似,只是没有实现块。

image-20231031175517787
图14.1 与类相似,委托是用户定义的引用类型

​ 可以将 delegate 看作一个包含有序方法列表的对象,这些方法具有相同的签名和返回类型。

  • 方法的列表称为调用列表。
  • 方法可以来自任何类或结构,只要满足如下的匹配:
    • 委托的返回类型。
    • 委托的签名(包含 ref 和 out)。
  • 方法可以是实例方法或者静态方法。
  • 调用委托时,会执行调用列表中的所有方法。
image-20231031175844019
图14.2 把委托看成一个方法列表

14.3 声明委托类型

  • 以关键字 delegate 开头。
  • 没有方法主体。
  • 不需要在类内部声明,因为委托是类型声明。
image-20231031180011561
图14.3 声明委托类型
image-20231031180112100
图14.4 委托类型和对象

14.4 创建委托对象

​ 声明委托类型的变量:

image-20231031180225040
图14.5 声明委托类型的对象

​ 创建委托对象的两种方式:

  1. 使用 new 运算符。
image-20231031180332435
图14.6 使用 new 运算符声明委托对象
  1. 使用快捷语法。

    方法和委托类型之间存在隐式转换,该快捷语法利用了这一特性。

image-20231031180524255
图14.7 使用快捷语法声明委托对象
image-20231031180625615
图14.8 初始化委托

14.5 给委托赋值

​ 可以通过赋值改变包含在委托变量中的引用,旧的委托对象会被垃圾回收器回收。

image-20231101125404347
图14.9 给委托变量赋值

14.6 组合委托

​ 使用 + 组合委托,委托对象被创建后不能再被改变。

image-20231101130526417 image-20231101130544013
图14.10 组合委托

14.7 为委托添加方法

image-20231101130627550 image-20231101130640228
图14.11 为委托添加方法

​ 在使用 += 运算符时,实际发生的是创建了一个新的委托,其调用列表是左边的委托加上右边方法的组合,然后将这个新的委托赋值给 delVar

14.8 从委托移除方法

​ 在使用 -= 运算符时,实际上也是创建了一个新的委托。

  • 如果在调用列表中的方法有多个实例,则删除最后一个。
  • 可以删除委托中不存在的方法,结果没有影响。
image-20231101131316490
图14.12 从委托移除代码的结果

14.9 调用委托

  • 可以使用两种方法调用委托。
    1. 像方法一样调用。
    2. 使用 InVoke 调用。
  • 如果一个方法在调用列表中多次出现,则调用委托时会被多次执行。
  • 试图调用空委托将会抛出异常,需要判断委托是否为 null。
image-20231101131607711
图14.13 在调用委托时,它使用相同的参数来执行调用列表中的每一个方法

14.10 委托的示例(*)

14.11 调用带返回值的委托

  • 调用列表中最后一个方法的返回值就是调用委托的返回值。
  • 调用列表中之前方法的返回值都会被忽略。

14.12 调用带引用参数的委托

​ 如果委托中有引用参数,参数值可能会根据调用列表中的方法而改变。

​ 在调用委托列表中的下一个方法,参数的新值会被传给下一个方法。

14.13 匿名方法

​ 匿名方法是在实例化委托时内联声明的方法。

image-20231101132059494
图14.14 比较具名方法和匿名方法

14.13.1 使用匿名方法

​ 可以在以下情况中使用匿名方法:

  1. 声明委托变量时,充当初始化表达式。
  2. 组合委托时,充当赋值表达式。
  3. 为委托增加事件时,充当事件表达式。

14.13.2 匿名方法的语法

image-20231102114230863
图14.15 匿名方法的声明
  1. 返回类型

    匿名方法不会显示声明返回值,但必须返回与委托返回值相同类型的值。

image-20231102114405754
图14.16 匿名方法的返回类型
  1. 参数

    匿名方法可以省略圆括号进行简化,但需要满足如下两个条件:

    • 委托的参数列表不包含任何 out 参数。
    • 匿名方法不使用任何参数。
image-20231102114719024
图14.17 匿名方法的返回类型
  1. params 参数

    如果委托声明的参数列表中包含 params,那么匿名方法的参数列表不能使用 params 关键字。

    • 委托类型声明指定最后一个参数为 params 类型。
    • 匿名方法的参数列表必须不带 params。
image-20231102114918194 image-20231102114951856
图14.18 匿名方法中不需要声明 params 关键字

14.13.3 变量和参数的作用域

​ 参数及声明在匿名方法内部的局部变量的作用域限制在实现代码的主体之内。

image-20231102115135444
图14.19 变量和参数的作用域
  1. 外部变量

    匿名方法可以访问它们外围作用域的局部变量和环境。

    • 外围作用域的变量称为 外部变量
    • 用匿名方法实现代码中的外部变量称为 被方法捕获
image-20231102115404498
图14.20 使用外部变量
  1. 捕获变量生命周期的扩展

    只要捕获方法是委托的一部分,即使变量已经离开了作用域,捕获的外部变量也会一直有效。

image-20231102133143583 image-20231102133211642
图14.21 在匿名方法中捕获的变量

14.14 Lambda 表达式

​ C# 2.0 引入了匿名方法,C# 3.0 引入了 Lambda 表达式。可以使用 Lambda 表达式代替匿名方法:

  • 删除 delegate 关键字。
  • 使用 Lambda 运算符 =>
image-20231102133413865
图14.22 使用 Lmabda 表达式
  • 编译器可以从委托声明中直到委托参数的类型,因此 Lambda 表达式可以省略类型参数。
    • 显示类型:带有类型的参数列表。
    • 隐式类型:省略类型的参数列表。
  • 如果只有一个隐式类型参数,可以省略圆括号。
  • 如果语句块只包含一个返回语句,可以省略 return
image-20231102133707064
图14.23 Lmabda 表达式的简化
  • 若委托有 ref 或 out 参数,则 Lambda 表达式必须为显示类型。
  • 如果没有参数,必须使用一组空的圆括号。
image-20231102133839353
图14.24 Lmabda 表达式形式总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1162396.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【笔记】excel怎么把汉字转换成拼音

1、准备好excel文件,复制需要转拼音列。 2、打开一个空白Word文档,并粘贴刚才复制的内容; 3、全选Word文档中刚粘贴的内容,点击「开始」选项卡「字体」命令组下的「拼音指南」,调出拼音指南对话框; 4、全…

java入门,哈希函数

一、前言 一听到哈希函数这种东西就感觉是数学,增加了人们的印象它很难。其中在数据结构中的HashMap的存储方式就用到了哈希函数,所以它也算是java的基础。看到哈希别惊慌,首先它只不过是个名称,我们理解它是个函数就行&#xff…

全球最强长文本大模型,一次可读35万汉字:Baichuan2-192K上线

大模型看书,从来没有这么快过。 国内大模型创业公司,正在技术前沿创造新的记录。 10 月 30 日,百川智能正式发布 Baichuan2-192K 长窗口大模型,将大语言模型(LLM)上下文窗口的长度一举提升到了 192K toke…

计算机体系结构图,冯诺依曼模型(控制器,运算器,指令集,存储器,cache),os(为什么要有os+如何管理举例,系统调用,用户操作接口)

目录 引入 硬件 -- 冯诺依曼模型 背景 早期 -- 硬件化 冯诺依曼结构 存储程序控制原理 核心思想 结构 cpu -- (运算器和控制器) 介绍 控制器 运算器 指令集 存储器 介绍 内部存储器 读写操作 高速缓冲存储器Cache 内存分类 RAM ROM 外部存储器 软件 -- …

Windows ObjectType Hook 之 ParseProcedure

1、背景 Object Type Hook 是基于 Object Type的一种深入的 Hook,比起常用的 SSDT Hook 更为深入。 有关 Object Type 的分析见文章 《Windows驱动开发学习记录-ObjectType Hook之ObjectType结构相关分析》。 这里进行的 Hook 为 其中之一的 ParseProcedure。文章实…

【入门Flink】- 03Flink部署

集群角色 Flik提交作业和执行任务,需要几个关键组件: 客户端(Client):代码由客户端获取并做转换,之后提交给JobManger JobManager:就是Fink集群里的“管事人”,对作业进行中央调度管理;而它获…

2021上半年下午网络工程师试题

2021上半年下午网络工程师试题 试题一(共20分) 阅读以下说明,回答问题1至问题4,将解答填入答题纸对应的解答栏内。 【说明】 某企业网络拓扑图如图1-1所示。该网络可以实现的网络功能有: 1.汇聚层交换机A与交换机B采用VRRP技术组网; 2.…

myabtis流式查询

1、流式查询简介 流式处理在大数据方面应用比较广泛。随着数据的爆发式增长,流式处理的方式也被应用到日常的工具中,如JDK的对于集合处理的Stream流、Redis5.0新增的数据结构Stream专门来处理消息等。 流式查询指的是查询成功后不是返回一个集合而是返回…

景联文科技:高质量数据采集清洗标注服务,助力大语言模型红蓝对抗更加精准高效

红蓝对抗是一种测试和评估大语言模型的方法。通过模拟真实世界测试AI模型的潜在漏洞、偏见和弱点,确保大型语言模型的可靠性和性能。 在红蓝对抗过程中,由主题专家组成的专业团队负责模拟攻击和提供反馈,他们试图诱导AI模型产生不当行为&…

电子商务平台对接电商供应链,不得不说的开放平台电商API接口

B2B电商开放平台的设计需要从以下几面去思考: 开放平台API接口的设计,主要是从功能需求的角度,设计满足业务需求的接口及对应的字段; 平台与商家之间信息的对接,对接的方法有哪些?对接过程中需要可能会遇到…

PaDiM 无监督异常检测和定位-论文和源码阅读

目录 1. 论文 1.1 检测效果 1.2 框架 1.2.1 特征提取embedding extraction 1.2.2 正样本学习Learning of the normality 1.2.3 计算异常图 inference: computation of the anomaly map 2. 源码 2.1 dataset 2.2 model 2.3 提取特征 1. 论文 https://arxiv.org/abs/…

Redis 6.0 新功能

1-支持 ACL 1.1-ACL 简介 官网:https://redis.io/topics/acl Redis ACL 是访问控制列表(Access Control List)的缩写,该功能允许根据可以执行的命令和可以访问的键来限制某些连接。 Redis 5 版本之前,Redis 安全规则只有密码控制&#xf…

Python元编程详细教程

嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 简单定义“元编程是一种编写计算机程序的技术,这些程序可以将自己看做数据, 因此你可以在运行时对它进行内审、生成和/或修改”&#xff…

SpringCloud篇---第三篇

系列文章目录 文章目录 系列文章目录一、负载平衡的意义什么?二、什么是Hystrix?它如何实现容错?三、什么是Hystrix断路器?我们需要它吗?一、负载平衡的意义什么? 在计算中,负载平衡可以改善跨计算机,计算机集群,网络链接,中央处理单元或磁盘驱动器等多 种计算资源的…

超高真空变温台的真空压力和气氛精密控制解决方案

摘要:针对目前国内外显微镜探针冷热台普遍缺乏真空压力和气氛环境精密控制装置这一问题,本文提出了解决方案。解决方案采用了电动针阀快速调节进气和排气流量的动态平衡法实现0.1~1000Torr范围的真空压力精密控制,采用了气体质量流量计实现多…

配置OpenCV

Open CV中包含很多图像处理的算法,因此学会正确使用Open CV也是人脸识别研究的一项重要工作。在 VS2017中应用Open CV,需要进行手动配置,下面给出在VS2017中配置Open CV的详细步骤。 1.下载并安装OpenCV3.4.1与VS2017的软件。 2.配置Open CV环…

纠结蓝桥杯参加嵌入式还是单片机组?

纠结蓝桥杯参加嵌入式还是单片机组? 单片机包含于嵌入式,嵌入式不只是单片机。. 你只有浅浅的的单片机基础,只能报单片机了。最近很多小伙伴找我,说想要一些单片机资料,然后我根据自己从业十年经验,熬夜搞了几个通宵…

Selenium安装WebDriver Chrome驱动(含 116/117/118/119/120/)

1、确认浏览器的版本 在浏览器的地址栏,输入chrome://version/,回车后即可查看到对应版本 2、找到对应的chromedriver版本 2.1 114及之前的版本可以通过点击下载chromedriver,根据版本号(只看大版本)下载对应文件 2.2 116版本…

1. eulerAngles函数

对线性代数库Eigen3中eulerAngles函数的理解_qingtian11112的博客-CSDN博客作用: 将旋转矩阵转换为欧拉角 Vector3f ea mat.eulerAngles(2, 0, 2); // 等价于 mat AngleAxisf(ea[0], Vector3f::UnitZ())* AngleAxisf(ea[1], Vector3f::UnitX())* AngleAxisf(ea[…