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#的语法糖可以简化很多工作。最后演示了通过使用反射可以在运行时动态的创建委托并进行调用。

posted @ 2010-04-20 16:14  bengxia  阅读(295)  评论(0编辑  收藏  举报
无觅相关文章插件,快速提升流量