您的位置:首页 > 其它

.Net Framework Programming 读书笔记(15)

2005-07-19 22:10 369 查看
17.1 认识委托

在非托管C++中的回调函数是非类型安全的。

FirstStart.cs源代码 实例。

17.2 使用委托回调静态方法

(解释上述源代码FirstStart.cs)

FeedbackToConsole方法在App类型中定义为private,但是Set类型的ProcessItems方法却能够调用它。这里不存在任何安全问题,因为App的代码自己已经显示决定返回一个私有方法的委托封装。

17.3 使用委托调用实例方法

InstanceCallbacks()方法。必须调用一个Object的实例,引用他的方法。

对于封装实例方法的情况,委托需要知道方法将要操作的实例对象。

17.4 委托揭秘

委托继承自System.MulticastDelegate类型。

回调方法代码:
public void ProcessItems(Feedback feedback)
{
for(Int32 item=0;item<items.Length;item++)
{
if(feedback!=null) feedback(items[item],item+1;items.Length);
}
}

看起来好像似调用名为feedback的函数,并传递给他3个参数。但是,实际上并没有feedback函数。因为编译器知道feedback是一个指向委托对象的变量,所以他会产生代码来调用该委托的Invoke方法。

17.5 委托史话:System.Deletgate / System.MulticastDalegate

定义的委托继承自Delegate/MulticastDelegate,具体来讲就是使用那些具有非void返回值的方法原形所表示的委托继承自System.Delegate,而使那些具有void返回值的方法原形所表示的委托继承自System.MulticastDelegate。

由于编译器的改动(.Net框架版本1种不能合并这两个类),不管回调方法是否有返回值,委托类型的所有实例都将可以被放到一个委托链表中。

17.6 委托判等

Delegate重载了Object的Equals方法,还重载了==和!=操作符。

17.7 委托链

每个委托对象都有一个_prev私有字段,该字段指向另一个MulticastDelegate对象的引用。也就是说每个MulticaseDelegate(或继承了他的类型)对象都有一个指向另一个MulticaseDelegate(或继承了他的类型)对象的引用。

合并操作(如 Combine 和 Remove)并不改变现有委托

17.8 C#对委托链的支持

Combine 和 Remove,在C#中+=和-=操作符可以简化。

17.9 对委托链调用施以更多的控制

使用Invoke方法具有调用一个委托对象之前的委托对象(如存在的话)的能力,所以我们可以保证委托链上的所有对象都会得到调用。除了最后一个回调方法的返回值外,其他的返回值都将被丢弃。如有一个调用抛出异常,或者阻塞很长时间,因为委托链上是按顺序调用,它将会阻止其他委托对象。

对于上述不足,MulticastDelegate类提供了一个实例方法GetInvocationList。我们可以使用它显示调用委托链上的每一个委托对象,这时我们可以采用任何满足需要的算法。

之后,使用foreach循环出所有的回调方法,并调用。

17.10 委托与反射

当开发人员在编译时,并不知道回调方法需要多少个参数,以及类型;在11.5中 EventHandlerSet类型展示了,使用一个散列表来维护一组不同的委托类型,在运行时,我们通过散列表查找并调用特定的委托对象来触发事件。

源代码DynamicDelegates.cs
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: