CLR via C# 笔记 -- 委托(17)

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). 包含实例成员引用,则定义匿名辅助类。

原文地址:https://www.cnblogs.com/Cxiaoao/p/14839591.html