1. 委托是方法的包装器,使方法能通过包装器来间接回调。在一个类型中通过委托来调用另一个类型的私有成员,只要委托对象是具有足够安全性/可访问性的代码创建,便没有问题。

2. 协变性:方法能返回从委托的返回类型派生的一个类型。逆变性:方法获取的参数可以是委托的参数类型的基类。

3. 委托实际上是一个类,继承自System.MulticastDelegate。构造函数、Invoke、BeginInvoke、EndInvoke、Combine、Remove。

4. 三个重要的非公共字段

  1). _target:当委托对象包装一个静态方法时,这个字段为null。当委托对象包装一个实例方法时,这个字段引用的是回调方法要操作的对象。换言之,这个字段指出要传给实例方法的隐式参数this的值

  2). _methodPrt:一个内部的整形值,CLR用它标识要回调的方法

  3).  _invocationList:该字段通常为null。构造委托链时它引用一个委托数组

5. 委托链。每增加一个,fbChain返回都是新的。

6. 删除委托时如果找到匹配的委托,并且删除后只剩下一个数据项,就返回那个数据项;如果剩余多个数据项,则新建一个委托对象并复制返回;如果没有数据项,则返回null。

7. 如果委托链中一个抛出异常或长时间阻塞,链中后续的所有对象都调用不了,考虑使用GetInvocationList() 重新实现委托链调用

8. 尽量使用Action和Func

9. 使用CreateDelegate和DynamicInvoke动态创建委托

lambda:

1). 不包含实例成员引用,则生成静态匿名函数。不需要额外的this参数,效率比较高。

2). 包含实例成员引用,则定义匿名辅助类。

CLR via C# 笔记 -- 委托(17)的更多相关文章

  1. <NET CLR via c# 第4版>笔记 第17章 委托

    17.1 初识委托 .net 通过委托来提供回调函数机制. 委托确保回调方法是类型安全的. 委托允许顺序调用多个方法. 17.2 用委托回调静态方法 将方法绑定到委托时,C# 和 CLR 都允许引用类 ...

  2. Android菜鸟的成长笔记(17)—— 再看Android中的Unbounded Service

    原文:Android菜鸟的成长笔记(17)-- 再看Android中的Unbounded Service 前面已经写过关于startService(Unbounded Service)的一篇文章:&l ...

  3. Flutter学习笔记(17)--顶部导航TabBar、TabBarView、DefaultTabController

    如需转载,请注明出处:Flutter学习笔记(17)--顶部导航TabBar.TabBarView.DefaultTabController 上一篇我们说了BottmNavigationBar底部导航 ...

  4. javaSE学习笔记(17)---锁

    javaSE学习笔记(17)---锁 Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率.本文旨在对锁相关源码(本文中的源码来自JDK 8).使用场景进行举例,为读 ...

  5. CLR读书笔记——委托

    协变性和逆变性 协变性是指方法能返回从委托返回类型派生的一个类型. 逆变性是指获取的参数可以是委托参数类型的基类. 举个例子吧,看以下定义的委托,以及方法. delegate Object MyCal ...

  6. 读CLR via C#笔记

    1.is 和 as 的区别 public class Employee { } a): object obj = new Employee(); if (obj is Employee) { Empl ...

  7. java JDK8 学习笔记——第17章 反射与类加载器

    第十七章 反射与类加载器 17.1 运用反射 反射:.class文档反映了类基本信息,从Class等API取得类信息的方式称为反射. 17.1.1 Class与.class文档 1.java.lang ...

  8. 多线程要点--CLR C#学习笔记

    1.windows永远不会调度一个进程,只调度线程. 2.线程和操作系统的关系:CLR(X)--AppDomain--线程池(包含工作者线程和I/O线程) 3.线程的关键组成部分 A.线程执行上下文 ...

  9. 类型基础---CLR Via C#笔记一

    一.所有类型都是从System.Obejct派生 1.下面两个类型定义是完全一致的: class Employee{ ... } class Employee:System.Object{ ... } ...

  10. CLR via C#笔记

    第一部分 CLR基础 CLR和JIT “运行时”如何解析类型引用 第二部分 设计类型 使用C#的is和as操作符来转型 运行时的相互联系 基元类型.引用类型和值类型 值类型的装箱和拆箱 哈希码 dyn ...

随机推荐

  1. WPF 已知问题 BitmapDecoder.Create 不支持传入 Asynchronous 的文件流

    这是在 GitHub 上有小伙伴报的问题,在 WPF 中,不支持调用 BitmapDecoder.Create 方法,传入的 FileStream 是配置了 FileOptions.Asynchron ...

  2. 一分钟部署 Llama3 中文大模型,没别的,就是快

    前段时间百度创始人李彦宏信誓旦旦地说开源大模型会越来越落后,闭源模型会持续领先.随后小扎同学就给了他当头一棒,向他展示了什么叫做顶级开源大模型. 美国当地时间4月18日,Meta 在官网上发布了两款开 ...

  3. Linux-0.11操作系统源码调试

    学习操作系统有比较好的两种方式,第一种是跟着别人写一个操作系统出来,<操作系统真相还原>.<Orange's:一个操作系统的实现>等书就是教学这个的:另一种方式就是调试操作系统 ...

  4. radmin远程控制软件怎么样,有没有替代品

    Radmin 是流行的.屡获殊荣的安全远程控制软件,它使您能够在远程计算机上实时工作,就像使用它自己的键盘和鼠标一样. 您可以从多个地方远程访问同一台计算机,是网络和管理类别中流行的远程桌面工具. R ...

  5. 4G LTE/EPC UE 的附着与去附着

    目录 文章目录 目录 UE 附着 UE 与 MME 建立 NAS 连接 UE 附着协议全景 UE 附着流程 UE 去附着 UE 侧发起的去附着 MME 发起的去附着 HSS 发起的去附着 UE 附着 ...

  6. 自定义Naive UI的数据表格Data Table中按钮Button图标

    在Naive UI官网中详细介绍了[数据表格 Data Table](数据表格 Data Table - Naive UI)的使用方式 { title: "Action", key ...

  7. 安卓开发封装处理Retrofit协程请求中的异常

    上篇文章讲解了怎么使用Kotlin的协程配合Retrofit发起网络请求,使用也是非常方便,但是在处理请求异常还不是很人性化.这篇文章,我们将处理异常的代码进行封装,以便对异常情况返回给页面,提供更加 ...

  8. python 实现限流

    固定窗口 固定窗口就是记录一个固定的时间窗口内的操作次数,操作次数超过阈值则进行限流. def fix_window_limit(redis_obj, period, max_count): &quo ...

  9. 鸿蒙极速入门(五)-路由管理(Router)

    页面路由指在应用程序中实现不同页面之间的跳转和数据传递.HarmonyOS提供了Router模块,通过不同的url地址,可以方便地进行页面路由,轻松地访问不同的页面. 一.基础使用 Router模块提 ...

  10. vue 的时间格式化

    大江东去,浪淘尽,千古风流人物.故垒西边,人道是,三国周郎赤壁.乱石穿空,惊涛拍岸,卷起千堆雪.江山如画,一时多少豪杰.遥想公瑾当年,小乔初嫁了,雄姿英发.羽扇纶巾,谈笑间,樯橹灰飞烟灭.故国神游,多 ...