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