惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Recent Announcements
Recent Announcements
博客园 - Franky
博客园 - 三生石上(FineUI控件)
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Apple Machine Learning Research
Apple Machine Learning Research
云风的 BLOG
云风的 BLOG
人人都是产品经理
人人都是产品经理
博客园 - 【当耐特】
L
LangChain Blog
Stack Overflow Blog
Stack Overflow Blog
H
Help Net Security
爱范儿
爱范儿
罗磊的独立博客
博客园_首页
美团技术团队
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
月光博客
月光博客
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
量子位
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 叶小钗
V
Visual Studio Blog
T
Tailwind CSS Blog

博客园 - bengxia

DataGridView中的{索引-1沒有值}异常 Silverlight + WCF + Sharepoint(Silverlight Web Part) 问题集合 CLR Via C# 3rd 阅读摘要 -- Chapter 29 – Hybrid Thread Synchronization Constructs CLR Via C# 3rd 阅读摘要 -- Chapter 28 – Primitive Thread Synchronization Constructs FIX: Unable to find a version of the runtime to run this application. CLR Via C# 3rd 阅读摘要 -- Chapter 27 – I/O-Bound Asynchronous Operations CLR Via C# 3rd 阅读摘要 -- Chapter 26 – Compute-Bound Asynchronous Operations CLR Via C# 3rd 阅读摘要 -- Chapter 25 – Thread Basics CLR Via C# 3rd 阅读摘要 -- Chapter 24 – Runtime Serialization CLR Via C# 3rd 阅读摘要 -- Chapter 23 – Assembly Loading and Reflection CLR Via C# 3rd 阅读摘要 -- Chapter 22 – CLR Hosting and AppDomains CLR Via C# 3rd 阅读摘要 -- Chapter 21 – Automatic Memory Management (Garbage Collection) CLR Via C# 3rd 阅读摘要 -- Chapter 20 – Exceptions and State Management - bengxia CLR Via C# 3rd 阅读摘要 -- Chapter 19 – Nullable Value Types CLR Via C# 3rd 阅读摘要 -- Chapter 18 - Custom Attributes CLR Via C# 3rd 阅读摘要 -- Chapter 16 - Arrays - bengxia CLR Via C# 3rd 阅读摘要 -- Chapter 15 - Enumerated Types and Bit Flags CLR Via C# 3rd 阅读摘要 -- Chapter 14 - Chars, Strings, and Working with Text CLR Via C# 3rd 阅读摘要 -- Chapter 13 - Interfaces
CLR Via C# 3rd 阅读摘要 -- Chapter 17 - Delegates
bengxia · 2010-04-20 · via 博客园 - bengxia

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