Delegate与MutlticastDelegate

 前几天,被人问到Delegate与MulticastDelegate。当时被问得有些蒙。为什么呢?因为这个问题,似乎有些扯。

 

在.net的框架里面,我们可以看到Delegate和MulticastDelegate。Delegate可以接受具有返回值的函数,但是不支持多播委托,也就是说,它只能“装下”一个回调函数。
而MulticastDelegate则可以装下多个回调函数,但是对支持的回调函数有限制,就是返回值必须为void。

这样设计还是有道理的,因为对于多播委托,我们只能得到最后一个被调用的方法的返回值,所以如此限制,也是合理的。

 

上面说的这些,应该是微软最早的设计了。虽然这样的区分有一些道理,但是后来还是遇到了些问题。比如在多播委托里面,我们的函数虽然有返回值,但是在某些情况下可以忽略。可是,对这些函数,就不能使用多播委托。因此,微软决定把他们何并起来,也就是允许多播委托支持具有返回值的方法。
只是这个决定来得晚了些,晚到.net马上就要发布。因此,我们现在还是能在System下面看到Delegate和MulticastDelegate。不过微软还是可以修改他们的编译器,我们用Delegate声明的委托,其实编译后,都是继承自MulticastDelegate的。

 

也就是说,其实,Delegate这可怜的孩子,已经被抛弃了。也许未来的哪一天,我们就只能看到MulticastDelegate的身影了。所以,当我被问到Delegate和MulticastDelegate的时候,感觉就好像被人问茴香豆的茴有几种写法,一下就晕菜了。

 

接下来,我们写个小例子,来看下当MulticastDelegate支持具有返回值的方法的时候,是怎样一个执行过程。
先写个Delegate:
public delegate int IntBack(int i);

然后写两个方法用来回调。
static int iback1(int i)
{
    Console.WriteLine("ibakc1 is called:{0}",i);
    return i;
}

static int iback2(int i)
{
    i++;
    Console.WriteLine("ibakc2 is called:{0}",i);
    return i;
}

然后是声明delegate并且调用:
int t;
IntBack ib = null;
ib += new IntBack(iback1);
ib += new IntBack(iback2);
t = ib(5);

最后,t的结果是6。通过调试跟踪,可以代码是这样执行的:
先执行ib(5);
1:static int iback1(int i)
2:{
3:    Console.WriteLine("ibakc1 is called:{0}",i);
4:   return i;
5:}
6:static int iback2(int i)
7:{
8:    i++;
9:    Console.WriteLine("ibakc2 is called:{0}",i);
10:    return i;
11:}
其中第4行的return,并没有把i返回给t,第10行的return才真正的把i返回给了t。

 

好了,MulticastDelegate已经很好的支持了具有返回值的方法了,现在是忘记Delegate的时候了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值