委托事件观察者模式资料.doc
《委托事件观察者模式资料.doc》由会员分享,可在线阅读,更多相关《委托事件观察者模式资料.doc(50页珍藏版)》请在咨信网上搜索。
1、委托事件观察者模式资料 作者: 日期:50 个人收集整理 勿做商业用途认识C#中的委托和事件引言委托 和 事件在 .eFawok中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里别b)得慌,混身不自在。本文中,我将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、.Net rameork中的委托和事件、委托和事件对bsrver设计模式的意义,对它们的中间代码也做了讨论。 将方法作为方法的参数 我们先不管这个标题如何的绕口,也不管委托终究是个什么东西
2、,来看下面这两个最简单的方法,它们不过是在屏幕上输出一句问候的话语:pulic voi Geeeolestrignam) / 做某些额外的事情,比方初始化之类,此处略 EnghGreting(am); public vod nlihGeting(string nsleWriteLneMornng, + nam; 暂且不管这两个方法有没有什么实际意义。Greeteople用于向某人问好,当我们传递代表某人姓名的nme参数,比方说“Jimy,进去的时候,在这个方法中,将调用EliGeetg方法,再次传递name参数,EnglshGreetin那么用于向屏幕输出 “Morning,immy。 现在假
3、设这个程序需要进展全球化,哎呀,不好了,我是中国人,我不明白“rnn是什么意思,怎么办呢?好吧,我们再加个中文版的问候方法: publicvoid ChineseGreetig(trng name) Console.riteLne(早上好, + ame); 这时候,GreetPeopl也需要改一改了,不然如何判断到底用哪个版本的reeting问候方法适宜呢?在进展这个之前,我们最好再定义一个枚举作为判断的依据: pubi enum Lngge Enlish, Chines pblicodGreeteople(strinnme, angue lang)/做某些额外的事情,比方初始化之类,此处略
4、swih(lang) case Langage.English: EnlishGreting(am);break; cae Lanag.Cinese:ieseGring(name; eak; OK,尽管这样解决了问题,但我不说大家也很容易想到,这个解决方案的可扩展性很差,如果日后我们需要再添加韩文版、日文版,就不得不反复修改枚举和rePeople(方法,以适应新的需求。在考虑新的解决方案之前,我们先看看 GreetPeple的方法签名: pl oi GeePeople(tring me, agag lng) 我们仅看 sring nme,在这里,tring 是参数类型,nam是参数变量,当我们
5、赋给na字符串“jimmy时,它就代表“immy这个值;当我们赋给它“张子阳时,它又代表着“张子阳这个值。然后,我们可以在方法体内对这个ame进展其他操作。哎,这简直是废话么,刚学程序就知道了。 如果你再仔细想想,假设GeetPeople()方法可以承受一个参数变量,这个变量可以代表另一个方法,当我们给这个变量赋值 EnglisGreeting的时候,它代表着 glsihGreing) 这个方法;当我们给它赋值Chineseetng的时候,它又代表着ChineseGreetng()方法。我们将这个参数变量命名为 aeGretig,那么不是可以如同给ame赋值时一样,在调用 GreetPople
6、()方法的时候,给这个akeGreeting参数也赋上值么(ChineeGeng或者EnlihGreting等)?然后,我们在方法体内,也可以像使用别的参数一样使用MakGreting。但是,由于MkeGreein代表着一个方法,它的使用方式应该和它被赋的方法(比方hinsGreeting是一样的,比方: Makeeting(na); 好了,有了思路了,我们现在就来改改GreetPeople()方法,那么它应该是这个样子了: blc vid Geeteole(stin nme, * kereeti) MkeGennam); 注意到*,这个位置通常放置的应该是参数的类型,但到目前为止,我们仅仅是
7、想到应该有个可以代表方法的参数,并按这个思路去改写GretPeole方法,现在就出现了一个大问题:这个代表着方法的akereting参数应该是什么类型的? OTE:这里已不再需要枚举了,因为在给aeGreeting赋值的时候动态地决定使用哪个方法,是Chineereeting还是 nisGeetig,而在这个两个方法内部,已经对使用“mning还是“早上好作了区分。聪明的你应该已经想到了,现在是委托该出场的时候了,但讲述委托之前,我们再看看MkGtng参数所能代表的 hneretn)和ishGreeng()方法的签名: public vd ElishGretinstrin nam)uc id
8、ChiesGreeing(strnname如同am可以承受tring类型的“true和“1,但不能承受oo类型的true和in类型的1一样。Meetig的参数类型定义 应该能够确定 aketig可以代表的方法种类,再进一步讲,就是MGreeting可以代表的方法的 参数类型和祷乩嘈汀?b 于是,委托出现了:它定义了MakeGreng参数所能代表的方法的种类,也就是MkeGretg参数的类型。NOT:如果上面这句话比拟绕口,我把它翻译成这样:strg定义了name参数所能代表的值的种类,也就是m参数的类型。 本例中委托的定义:public dleg vidGretingeleate(strin
9、nm; 可以与上面gliGreetin()方法的签名比照一下,除了参加了delegate关键字以外,其余的是不是完全一样? 现在,让我们再次改动GreePople(方法,如下所示:pblc vod Greeeoplestin ne, Geetigga MkeGreeting) MakeGeetiname); 如你所见,委托reengelegate出现的位置与 trin一样,trng是一个类型,那么GrtnDelegate应该也是一个类型,或者叫类(Clss。但是委托的声明方式和类却完全不同,这是怎么一回事?实际上,委托在编译的时候确实会编译成类。因为legat是一个类,所以在任何可以声明类的地
10、方都可以声明委托。更多的内容将在下面讲述,现在,请看看这个范例的完整代码:sng System; sg Syst.lections.Generc; sng SstText; namespae elegae /定义委托,它定义了可以代表的方法的类型 public eegteoid Getinglegat(strigame); cass Prog pivate ic vod Enlishreetnsringame) ConsolriteLin(Moning, + name; prvat taicvoidChineseGreetng(strinnme) onso.WriteLin(早上好, + na
11、me); /注意此方法,它承受一个GretgDelge类型的方法作为参数prit tatc voi Grtope(tin name, GreetngDeleae MakeGreein Mkereetin(ne); static oid Main(string rgs) GreetPeople(JmmyZhang,gishGreetng); retPepe(张子阳, CieseGreting);Cnsole.RadKy; 输出如下:Morning, Jimmy hg 早上好,张子阳 我们现在对委托做一个总结:委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进展传递,这种将方
12、法动态地赋给参数的做法,可以防止在程序中大量使用If-letch)语句,同时使得程序具有更好的可扩展性。将方法绑定到委托 看到这里,是不是有那么点如梦初醒的感觉?于是,你是不是在想:在上面的例子中,我不一定要直接在reePeol)方法中给name参数赋值,我可以像这样使用变量: staic vid Min(sng rgs) sring ame1, ame2; ae1= Jmy Zhn; ne =张子阳; GeetPeople(ae1, EnlishGrei); GePeoplnae,CineseGretng);CnsoleReadKey(); 而既然委托GreeingDeeate和 类型str
13、ing的地位一样,都是定义了一种参数类型,那么,我是不是也可以这么使用委托?statc voidain(t ags) Greinelegate delt1, eate2; delegte1 =glishreeing; delegae2 = Cneserein;GretPeople(JimmyZang,elgat); GetPeole(张子阳, elgte2);Consol.Reaey();如你所料,这样是没有问题的,程序一如预料的那样输出。这里,我想说的是委托不同于strng的一个特性:可以将多个方法赋给同一个委托,或者叫将多个方法绑定到同一个委托,当调用这个委托的时候,将依次调用其所绑定的方
14、法。在这个例子中,语法如下:stativoiMairng rgs) Greingeleat delgate1; dlegat1= Egireetin;/ 先给委托类型的变量赋值eegat1 +=Cinesereetig;/ 给此委托变量再绑定一个方法/ 将先后调用 EglsGreetg 与 ineseGreetng 方法 reeteole(Jmm Zhang,delegat1); Conle.eadKey; 输出为: Morning, Jimy Zang 早上好, imm ag实际上,我们可以也可以绕过reeope方法,通过委托来直接调用lishretg和CinsGeeg: tatic voi
15、dMain(tring ags) GreetinDelte dlegate1; delegate = Eglihreeting; / 先给委托类型的变量赋值 delegae1 +=Chinesereetig; / 给此委托变量再绑定一个方法 / 将先后调用 ngiheing 与 Chineeen 方法dlega1 (immy Zan); CosoeReaKey); NOE:这在本例中是没有问题的,但回头看下上面retPple)的定义,在它之中可以做一些对于EnglhihGrtng和ChineseGreting来说都需要进展的工作,为了简便我做了省略。注意这里,第一次用的“=,是赋值的语法;第二
16、次,用的是“+=,是绑定的语法。如果第一次就使用“=,将出现“使用了未赋值的局部变量的编译错误。 我们也可以使用下面的代码来这样简化这一过程:GetigDlegae legate1 =new GeetingDeae(EnlishGeeting); eleate1 += hineeGreeting; / 给此委托变量再绑定一个方法看到这里,应该注意到,这段代码第一条语句与实例化一个类是何其的相似,你不禁想到:上面第一次绑定委托时不可以使用“=的编译错误,或许可以用这样的方法来防止:GreetingDleate deegte = new GreeingDelgat(); delegae1 += E
17、nglisGretin; /这次用的是 “+=,绑定语法。 delege=Chinesereting; /给此委托变量再绑定一个方法 但实际上,这样会出现编译错误:“GeetngDlete方法没有采用“0个参数的重载。尽管这样的结果让我们觉得有点沮丧,但是编译的提示:“没有个参数的重载再次让我们联想到了类的构造函数。我知道你一定按捺不住想探个终究,但再此之前,我们需要先把根底知识和应用介绍完。 既然给委托可以绑定一个方法,那么也应该有方法取消对方法的绑定,很容易想到,这个语法是“-=:tati oidMain(string ag) reetingDlate delegate1= new Gre
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 委托 事件 观察者 模式 资料
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【天****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【天****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。