壮志凌云,脚踏实地。
改变,坚持。
委托是一个类,将方法封装成委托类型的对象。委托对象里包含三个部分的东西:
1、指向方法的指针,标识要回调的方法。
2、指向方法所指向的对象的指针,默认为null,当封装静态方法时,指针为null;当封装对象的方法时,指针指向当前调用方法的对象。
3、构建委托链表时对委托对象的索引。
上面第一个定义的委托F()等价与类F;而下面的定义的委托FS()等价与类FS。当用委托F分别调用类A、B、C的方法fA(),fB(),fC()时,分别将三个方法封装成三个委托类型FS的委托对象;同理,当用委托FS分别调用类A、B、C中的静态方法fSA()、fSB()、fSC()时,分别将前面三个方法封装成委托类型FS的对象。
    为什么不同的方法需要不同的委托类型对象来封装呢,这就引出了委托的类型安全的调用。只有当方法的签名,也就是方法的返回类型、参数类型等和委托类型一致时,才能对它进行封装。
用法:
调用实例方法时:F  f += new F(fs);或者直接利用委托提供的便利方式 F f += fs;
调用静态方法时:FS fs += new FS(A.fSA);或者直接利用委托提供的便利方式 FS fs += A.fSA;
与C/C++回调函数的不同:
1、C/C++里的回调函数只是一个函数指针,而C#里的委托是一个对方法封装的委托对象。
2、C/C++里不提供类型安全,而C#的方法签名必须与委托类型对象一致。
3、C/C++里一个函数指针只能指向一个方法,但委托因为是一个对象,里面不但有指向函数的指针,还可以指向调用该方法的对象,以及指向委托对象的索引,因此一个委托类型对象可以指向多个委托对象,也就是可以形成委托链表。只是是利用数组实现的。
例子,当委托对象fs调用静态方法fSA()、fSB()和fSC()时,整个个委托对象链如下如下图:
                                                            委托对象调用静态方法
因为是静态方法,所以_target指向为null;当调用的是实例方法时;_target指向各自对象即可。如下图所示。
 
                                                          委托对象调用实例方法
 



通过 Wiz 发布



posted on 2011-09-20 14:27  woxf  阅读(860)  评论(2编辑  收藏  举报