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

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(),它们的正确用法是本章的主题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值