CLR Via C# 3rd 阅读摘要 -- Chapter 17 - Delegates
A First Look at Delegates
1. 委托就是回调函数的一种形式,委托指出了回调方法的签名;
2. 委托是类型安全的回调方法;
3. 使用delegate关键字定义委托,使用new来构造委托的实例,像方法一样调用然后引发回调。
Use Delegates to Call Back Static Methods
1. C#和CLR在绑定一个方法到委托时运行对引用类型进行协变和逆变 。
Use Delegates to Call Back Instance Methods
1. 对于实例方法,委托需要知道将要操作的方法的对象的实例。
Demystifying Delegates
1. 委托实际上继承于System.MulticastDelegate->System.Delegate,并有三个公开的虚方法Invoke, BeginInvoke,EndInvoke;
2. 委托可以定义其他类型内部,也可以定义在全局空间;
3. Feedback fbStatic = new Feedback(Program.FeedbackToConsole);和Feedback fbInstance = new Feedback(new Program.FeedbackToFile());在初始化后:
Use Delegates to Call Back Many Methods(Chaining)
1. Delegate.Combine构造一个新的委托对象,然后初始化_invocationList字段指向到委托对象数组;注意几乎每次Combine都会产生一个委托对象。
2. C#提供了+=,-=重载操作符来方便委托的Combine和Remove;
3. 在委托链中,回调方法的返回值除了最后一个,其他都被丢弃;
4. 可以通过MulticastDelegate的GetInvocationList获得链中的所有委托,显示的逐个调用。
Enough with the Delegate Definitions Already(Generic Delegates)
1. 以前在MSCorLib.DLL中提供了很多的预先定义的委托类型;
2. 但是现在推荐使用Action和Func这两个泛型委托类型,注意0到8个参数的泛型委托定义在MSCorLib.DLL中,其他的定义在System.Core.DLL中。
C#'s Syntatical Sugar for Delegates
1. 不用构造一个委托对象。比如ThreadPool.QueueUserWorkItem() ,第一个参数会传入WaitCallback委托对象;
2. 不用定义一个回调方法。lambda表达式:ThreadPool.QueueUserWorkItem(obj => Console.WriteLine(obj), 5);
3. 不用在类中包装本地变量手动的传入回调方法。
Delegates and Reflection
1. System.Delegate.CreateDelegate可以利用反射动态的创建委托,System.Delegate.DynamicInvoke可以在运行时动态的调用。
本章小结
本章讨论委托,委托是一种类型安全的回调函数。委托可以回调静态方法或者实例方法。委托实际上继承至MulticastDelegate,委托可以链接在一起挨个调用。Action和Func是连个非常有用的泛型委托。然后介绍了在操作委托时使用一些C#的语法糖可以简化很多工作。最后演示了通过使用反射可以在运行时动态的创建委托并进行调用。