.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
在非托管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
相关文章推荐
- .Net Framework Programming 读书笔记(9)
- .Net Framework Programming 读书笔记(12)
- .Net Framework Programming 读书笔记(10)
- .Net Framework Programming 读书笔记(13)
- .Net Framework Programming 读书笔记(14)
- .Net Framework Programming 读书笔记(6)
- .Net Framework Programming 读书笔记(7)
- .Net Framework Programming 读书笔记(8)
- .Net Framework Programming 读书笔记(11)
- <Applied Microsoft .net framework programming>读后感
- [读书]Applied Microsoft .NET Framework programming
- Samples for Parallel Programming with the .NET Framework
- 【.Net Micro Framework PortingKit – 15】移植总结(兼谈MF未来发展) 推荐
- Applied Microsoft .net framework Programming---Chapter 1
- MapScript C# Tutorial - Programming MapServer in the ASP .NET Framework(转)
- 【.Net Micro Framework PortingKit – 15】移植总结(兼谈MF未来发展)
- Programming the Thread Pool in the .NET Framework
- net programming for microsoft windows 读书笔记
- OREILLY Programming .NET 3.5 读书笔记之一
- Parallel Programming Easier than ever using .NET Framework 4