欢迎来到天天文库
浏览记录
ID:23684807
大小:63.00 KB
页数:10页
时间:2018-11-09
《.框架中委托的实现及设计思想分析》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、.框架中委托的实现及设计思想分析摘要:委托是.中新增加的函数调用机制,实现了函数调用的晚绑定,方便了程序员在程序开发时灵活的对函数进行调用,比起C++的函数指针,也有封装性好,安全性高的优点。委托的实现原理体现了设计模式的思想,委托比较适合框架开发,设计模式则是面向对象的思想,两者的侧重点有不同,但在有些应用场合,利用委托可以达到使用设计模式的效果。关键词:关键词:.;委托;设计模式;函数指针中图分类号:TP39文献标识码:A:1.委托探秘 在CLR中,委托是通过委托类来实现的,delegate编译过后会产生一个继承自MulticastDele
2、gate的类。比如下面这段代码:publicdelegatevoidDelegateMethod(intval)编译器遇到这段代码时,会产生一个完整的类定义:publicclassDelegateMethod:System.MulticastDelegate{//构造器publicDelegateMethod(Objecttarget,Int32methodPtr);//下面的方法和源代码中指定的原型一样publicvoidvirtualInvoke(intval);//下面两个方式是对委托的异步调用publicvirtualIAsyncRes
3、ultBeginInvoke(intval);publicvirtualvoidEndInvoke(IAsyncResultresult);}此外,父类MulticastDelegate中有三个重要的私有字段:_target:指向回调函数被调用时应该被操作的对象_methodPtr:clr用它来标识回调方法_prev:指向另一个委托对象。当没有另一个委托对象时,该字段为null 下面从三个方面具体阐述:1.1委托的创建机制 委托的构造函数接收两个参数:一个对象引用和一个指向回调方法的整数。在编译时,编译器会通过分析源代码来确定引用的是哪个对象和
4、方法。其中对象引用会被传递个target参数,一个特殊的标识方法的值会被传递个methodPtr参数,对于静态方法,null会被传递个target参数。构造器中,这两个参数会被保存在相应的私有字段中,并将_prev字段设置为null。1.2委托的调用机制 当委托被调用时,实际调用的类中的Invoke方法。当Invoke被调用时,它使用_target和_methodPtr两个私有字段来在指定的对象上调用期望的方法。 BeginInvoke和EndInvoke是委托的异步调用。1.3委托链 C#编译器为委托类型实例提供了+=和-=操作符来简化委托链
5、的构造。委托链的实现是依靠MulticastDelegate对象中的私有字段_prev,该字段指向另一个MulticastDelegate对象的引用,这使得多个委托对象可以组合成一个链表。 每当向委托链中使用“+”操作符添加新的委托时,新添加的委托对象的prev字段就会指向原有的委托对象。当调用委托链中的委托操作时,会先获取到最后添加的委托对象,然后根据其prev字段查找它之前的委托对象,只有前一个委托对象执行完操作后,才会执行当前的委托操作,所以遍历委托链上的操作是一个递归算法。2.委托中体现的设计模式思想 设计模式体现了设计思想,在软件开发
6、中运用GOF面向对象设计模式,能实现软件模块的高内聚,低耦合,大大提高了软件的灵活性及可可扩展可维护性。 在软件开发中,运用设计模式是非常灵活的,由于设计模式体现的是设计思想,所以不要为想用设计模式而使用设计模式,先入为主的使用设计模式是不恰当的。在实际开发过程中,一方面往往通过已有项目经验采取适当的设计模式,另一方面,是循序渐进,不断改进的使用设计模式。学好设计模式对掌握面向对象的软件开发思想大有裨益。 Delegate是.提供的委托机制,.将实现委托的细节封装起来,使得用户可以直接使用委托,而不需要知道内部实现原理。这样,委托的使用场景也就
7、跳出了面向对象设计思想的范畴,从而变得更为灵活, 委托的内部实现折射出设计模式的思想,而且灵活运用设计模式,也能使我们编写出具有委托功能的软件模块。探讨委托与设计模式的关系,可以加强对设计模式的理解,并更好的理解委托的实现及用途。2.1Delegate与TemplateMethod(模板方法)模式 模板方法设计模式意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 模板方法设计模式结构: 在模板方法设计模式中,由父类(结构图中的Abstract
8、Class)编写模板调用方法(结构图中的TemplateMethod),并声明模板调用中的每一个具体方法(结构图中的PrimtiveOperation
此文档下载收益归作者所有