您的位置:首页 > 其它

Programming .NET Components 2nd 学习笔记(十二)

2012-09-02 15:35 197 查看
7.2. Revisiting Delegates

正如在第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(),它们的正确用法是本章的主题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: