Programming .NET Components 2nd 学习笔记(十二)
2012-09-02 15:35
197 查看
7.2. Revisiting Delegates
正如在第6章解释到,对于程序员,委托不过是一个类型安全的方法引用。委托被用来将客户端调用某个对象(或者类的静态方法)方法的动作委托到委托类上。例如,考虑一个Calculator类:
替代直接调用Add()方法,你可以定义一个叫做BinaryOperation的委托:
然后使用BinaryOperation调用方法:
默认情况下,当你使用委托调用方法时,委托会阻塞调用方直到所有目标方法返回。在刚才展示的例子中,调用方会被阻塞,直到Add()返回。然而,委托也可以用于异步调用目标方法。事实上委托并没有特别之处,因为委托实际上也被编译为类。当你定义一个委托类型时,编译器将委托声明转换为复杂的、特定于签名的类定义,并插入到类来替代委托定义。例如,这个委托定义:
编译器会生成如下类定义:
当你使用委托简单地调用一个方法,例如下面的代码:
编译器将对oppDel(2,3)的调用转换为调用Invoke()方法。Invoke()方法阻塞调用方,在调用方线程执行方法,然后返回控制权给调用方。
编译器生成的BinaryOperation类继承了System命名空间里的MulticastDelegate类。MulticastDelegate类提供了每个委托拥有的内部委托列表的实现,并且它派生于抽象类Delegate。
编译器同样声明了两个用来管理异步方法调用的方法。这些方法是BeginInvoke()和EndInvoke(),它们的正确用法是本章的主题。
正如在第6章解释到,对于程序员,委托不过是一个类型安全的方法引用。委托被用来将客户端调用某个对象(或者类的静态方法)方法的动作委托到委托类上。例如,考虑一个Calculator类:
public class Calculator { public int Add(int argument1,int argument2) { return argument1 + argument2; } public int Subtract(int argument1,int argument2) { return argument1 - argument2; } //Other methods }
替代直接调用Add()方法,你可以定义一个叫做BinaryOperation的委托:
public delegate int BinaryOperation(int argument1,int argument2);
然后使用BinaryOperation调用方法:
Calculator calculator = new Calculator( ); BinaryOperation oppDel = calculator.Add;//Can use += as well int result = 0; result = oppDel(2,3); Debug.Assert(result == 5);
默认情况下,当你使用委托调用方法时,委托会阻塞调用方直到所有目标方法返回。在刚才展示的例子中,调用方会被阻塞,直到Add()返回。然而,委托也可以用于异步调用目标方法。事实上委托并没有特别之处,因为委托实际上也被编译为类。当你定义一个委托类型时,编译器将委托声明转换为复杂的、特定于签名的类定义,并插入到类来替代委托定义。例如,这个委托定义:
public delegate int BinaryOperation(int argument1,int argument2);
编译器会生成如下类定义:
public sealed class BinaryOperation : MulticastDelegate { public BinaryOperation(Object target,int methodPtr) {...} public virtual int Invoke(int argument1,int argument2) {...} public virtual IAsyncResult BeginInvoke(int argument1,int argument2, AsyncCallback callback,object asyncState) {...} public virtual int EndInvoke(IAsyncResult result) {...} }
当你使用委托简单地调用一个方法,例如下面的代码:
Calculator calculator = new Calculator( ); BinaryOperation oppDel = calculator.Add; oppDel(2,3);
编译器将对oppDel(2,3)的调用转换为调用Invoke()方法。Invoke()方法阻塞调用方,在调用方线程执行方法,然后返回控制权给调用方。
编译器生成的BinaryOperation类继承了System命名空间里的MulticastDelegate类。MulticastDelegate类提供了每个委托拥有的内部委托列表的实现,并且它派生于抽象类Delegate。
编译器同样声明了两个用来管理异步方法调用的方法。这些方法是BeginInvoke()和EndInvoke(),它们的正确用法是本章的主题。
相关文章推荐
- Programming .NET Components 2nd 学习笔记(十一)
- Programming .NET Components 2nd 学习笔记(九)
- Programming .NET Components 2nd 学习笔记(八)
- Programming .NET Components 2nd 学习笔记(一)
- Programming .NET Components 2nd 学习笔记(二)
- Programming .NET Components 2nd 学习笔记(三)
- ASP.NET Core 2 学习笔记(十二)REST-Like API
- Programming .NET Components 2nd 学习笔记(十)
- Linux netfilter 学习笔记 之十二 ip层netfilter的NAT模块代码分析
- Programming .NET Components, 2nd Edition [ILLUSTRATED]
- Programming ASP.NET 学习笔记(要点)第3章 控件:基本概念
- Json.Net学习笔记(十二) 协议解析
- Programming .NET Components 2nd 学习笔记(四)
- Programming .NET Components 2nd 学习笔记(七)
- Programming Computer Vision with Python (学习笔记十二)
- Asp.net控件开发学习笔记(十二)----数据绑定
- Json.Net学习笔记(十二) 协议解析
- ASP.NET学习笔记十二之AJAX
- 学习ASP.NET MVC5框架揭秘笔记-ASP.NET路由(十二)
- Asp.net控件开发学习笔记(十二)----数据绑定