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);
}
}