从对象的角度理解委托以及委托链的返回值获取

 

1.   委托
所有的委托都是从MulticastDelegate继承的。
MulticastDelegate并没有自己的方法,全部是重载Delegate的方法。
问题:
1.委托(delegate)关键字是一个对象,还是一个类?
答案:委托是一个类
2.delegate所声明的变量是一个对象,还是一个类?
答案:其实是一个类,在编译时把它翻译成一个Delegate的继承类。
3.委托的实质:
委托是一个 函数集合的类,这个集合可以有多个函数,也可以只有一个函数。
这个类说明了这个集合里面的方法,因为一个方法必须有对象才行,所以,必须有一个属性能够说明这个对象,即Target属性。
作为集合类,其中的方法和属性却有些奇怪,下面一一作分析:
 

成员
奇怪内容
解释
Target
一个集合应该没有Target的,或者说,Target也应该是一个集合
这个Target实际上是指向了其 最后一个函数实例的对象。、
Method
与上同
与上同
GetInvocationList
取得调用列表时,应该返回一个集合的列表,而在返回的列表中,每一个对象都是一个委托。
委托是一个集合,这个集合里的每一个成员又是一个委托,而每个成员却是只有一个成员的集合。实验也证明了这一点,遍历这个list,然后取得每一个成员,取个每个成员的集合,发现这个集合只有一个成员。
dl(1,2)
从对象角度考虑,应该不会有直接调用对象之说,但在这里却可以。
.NET框架实际在这里做了特化处理,具体处理如下:
如果这个委托实例只有一个元素,则调用这个元素,如果这个委托实例有多个元素,则依次调用每个元素的这个方法。

 
概念
delegate:是一个类Delegate,这个类在与委托相关的类上相当于System.Object对应于其它类。
委托(一般说的概念):指用delegate声明了的一种类型,实际上是一个类,继承自MulticaseDelegate。
委托实例:是一个对象,这个对象是属于一个委托类型。
事件:就是一个委托实例,即一个对象。一般说,使用一个事件,实际上并不是使用一个特殊的名词,而是使用一个委托实例(即一个对象)。
 
4.委托的返回值的捕获
在调用时,不直接调,通过遍历其委托链表,依次调用,然后把返回值传到一个序列对象里面去,则可以得到返回值。
2.   委托的调用
执行returnInt=a.dl(1,2)时,实际上是执行了如下动作:
(1)    得到链表
(2)    依次调用链表中的方法
即returnInt=a.dl(1,2)相当于
Delegate[] ds=a.GetInvocationList();
foreach(Delegate d in ds)
{
DL dl=(DL)d;
returnInt=d.Invoke(1,2);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值