欢迎来到天天文库
浏览记录
ID:40641343
大小:52.99 KB
页数:7页
时间:2019-08-05
《大白话系列之C#委托与事件讲解(三)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、大白话系列之C#委托与事件讲解(三)[我希望大家在看完文章的时候,多做做练习,自己也可以想个场景,动动手,这样才会有深刻的印象,不然遗忘的速度非常快]今天我接着上面的3篇文章来讲一下,为什么我们在日常的编程活动中遇到这么多sender,EventArgse参数:protectedvoidPage_Load(objectsender,EventArgse){}protectedvoidbtnSearch_Click(objectsender,ImageClickEventArgse){}protectedvoidgrdBill_RowDataBound(objectsender,Gri
2、dViewRowEventArgse){}那他们到底表示什么呢?在回答上面的问题之前,我们先搞懂.NetFramework的编码规范:一、委托类型的名称都应该以EventHandler结束。二、委托的原型定义:有一个void返回值,并接受两个输入参数:一个Object类型,一个EventArgs类型(或继承自EventArgs)。三、事件的命名为委托去掉EventHandler之后剩余的部分。四、继承自EventArgs的类型应该以EventArgs结尾。这就是微软编码的规范,当然这不仅仅是规则,而是在这种规则下使程序有更大的灵活性,那我们就继续重构第三讲的例子,让他符合微软的规范。
3、代码//所有订阅者【Subscriber】感兴趣的对象,也就是e,都要继承微软的EventArgs//本例中订阅者【也称观察者】MrMing,MrZhang他们感兴趣的e对象,就是杂志【magazine】publicclassPubEventArgs:EventArgs{publicreadonlystringmagazineName;publicPubEventArgs(){}publicPubEventArgs(stringmagazineName){this.magazineName=magazineName;}}//发布者(Publiser)publicclassPublis
4、her{//声明一个出版的委托//这里多了一个参数sender,它所代表的就是Subject,也就是监视对象,本例中就是PublisherpublicdelegatevoidPublishEventHander(objectsender,PubEventArgse);//在委托的机制下我们建立以个出版事件publiceventPublishEventHanderPublish;//声明一个可重写的OnPublish的保护函数protectedvirtualvoidOnPublish(PubEventArgse){if(Publish!=null){//Sender=this,也就是P
5、ublisherthis.Publish(this,e);}}//事件必须要在方法里去触发publicvoidissue(stringmagazineName){OnPublish(newPubEventArgs(magazineName));}}//Subscriber订阅者publicclassMrMing{//对事件感兴趣的事情publicstaticvoidReceive(objectsender,PubEventArgse){Console.WriteLine("嘎嘎,我已经收到最新一期的《"+e.magazineName+"》啦!!");}}publicclassMrZh
6、ang{//对事件感兴趣的事情publicstaticvoidReceive(objectsender,PubEventArgse){Console.WriteLine("幼稚,这么大了,还看《火影忍者》,SB小明!");Console.WriteLine("这个我定的《"+e.magazineName+"》,哇哈哈!");}}classStory{publicstaticvoidMain(string[]args){//实例化一个出版社Publisherpublisher=newPublisher();Console.Write("请输入要发行的杂志:");stringname=C
7、onsole.ReadLine();if(name=="火影忍者"){//给这个出火影忍者的事件注册感兴趣的订阅者,此例中是小明publisher.Publish+=newPublisher.PublishEventHander(MrMing.Receive);//发布者在这里触发出版火影忍者的事件publisher.issue("火影忍者");}else{//给这个出火影忍者的事件注册感兴趣的订阅者,此例中是小明[另一种事件注册方式]publisher.
此文档下载收益归作者所有