C#第十三讲事件老师讲义文档格式.docx
- 文档编号:21723336
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:21
- 大小:41.03KB
C#第十三讲事件老师讲义文档格式.docx
《C#第十三讲事件老师讲义文档格式.docx》由会员分享,可在线阅读,更多相关《C#第十三讲事件老师讲义文档格式.docx(21页珍藏版)》请在冰豆网上搜索。
(一)委托代理静态的方法
委托包含的方法,必须与委托具备同样的返回类型和同样的参数类型
(1)
usingSystem;
namespaceDelegateApp
{
classMyDelegate
{
staticvoidzsEat(stringfood)
Console.WriteLine("
张三吃"
+food);
}
staticvoidMain(string[]args)
zsEat("
西瓜"
);
}
(2)
delegatevoidEatDelegate(stringname);
EatDelegatezs=newEatDelegate(zsEat);
zs("
(3)
staticvoidlsEat(stringfood)
李四吃"
+food);
staticvoidwwEat(stringfood)
王五吃"
EatDelegatels=newEatDelegate(lsEat);
EatDelegateww=newEatDelegate(wwEat);
ls("
ww("
二、委托链:
像调用方法一样调用这个委托链它就会依次按照加入的顺序去执行这几个委托所对应的函数。
(4)
EatDelegateeatChain;
eatChain=zs+ls+ww;
eatChain("
(5)
张三、李四、王五开座谈会"
李四出去接电话"
eatChain-=ls;
香蕉"
李四回来了"
eatChain+=ls;
桔子"
三、匿名方法
匿名方法由关键字delegate、可选的参数列表和包含在{和}分隔符中的语句列表组成。
匿名方法允许将一段委托关联的代码以代码块的方式内嵌到使用委托的地方,可以省略委托方法的构造过程。
EatDelegateeatChain=null;
eatChain+=delegate(stringfood){Console.WriteLine("
};
(二)委托代理动态的方法
(6)
classMan
privatestringname;
publicMan(stringname)
this.name=name;
publicvoidEat(stringfood)
Console.WriteLine(name+"
吃"
classParty
ManZS=newMan("
张三"
ManLS=newMan("
李四"
ManWW=newMan("
王五"
EatDelegatezs=newEatDelegate(ZS.Eat);
EatDelegatels=newEatDelegate(LS.Eat);
EatDelegateww=newEatDelegate(WW.Eat);
EatDelegateeatChain=null;
(7)
staticvoidEatTogether(stringfood,paramsEatDelegate[]values)
if(values==null)
座谈会结束了"
else
EatDelegateeatChian=null;
foreach(EatDelegateedinvalues)
eatChian+=ed;
eatChian(food);
Console.WriteLine();
EatTogether("
zs,ls,ww);
zs,ww);
zs,ls,ww);
EatTogether(null,null);
四、事件
事件是对象发送的消息,以发信号通知操作的发生。
例如,封装用户界面控件的类可以定义一个在用户单击该控件时发生的事件。
控件类不关心单击按钮时发生了什么,但它需要告知派生类单击事件已发生。
然后,派生类可选择如何响应。
(一)事件发行者(Publisher)
一个事件发行者,也称作发送者(sender),其实就是一个对象,这个对象会自行维护本身的状态信息。
当本身状态信息变动时,便触发一个事件,并通知所有的事件订阅者。
(二)事件订阅者(Subscriber):
对事件感兴趣的对象,也称为接受者(Receiver),可以注册感兴趣的事件,通常需提供一个事件处理程序,在事件发行者触发一个事件后,会自动执行这段代码的内容。
(8)
namespaceEventApp
{
classPublisher//出版社
publicdelegatevoidPublish();
//声明事件所需的代理
publiceventPublishOnPublish;
//事件的声明
publicvoidIssue()//触发事件的方法
if(OnPublish!
=null)
发行刊物"
OnPublish();
}
classSubScriber//订阅者
publicvoidReceive()//在事件订阅者中定义事件处理程序
订阅者已经收到了刊物"
classStory
staticvoidMain()
PublisherPub=newPublisher();
SubScriberzs=newSubScriber();
Pub.OnPublish+=newPublisher.Publish(zs.Receive);
//向事件发行者订阅一个事件
Pub.Issue();
//触发事件
(9)
publicdelegatevoidPubComeputer(stringmagazineName);
publicdelegatevoidPubLife(stringmagazineName);
publiceventPubComeputerOnPubComputer;
publiceventPubLifeOnPubLife;
publicvoidIssueComputer()//触发事件的方法
if(OnPubComputer!
发行<
<
电脑>
>
刊物"
OnPubComputer("
电脑杂志"
publicvoidIssueLife()//触发事件的方法
if(OnPubLife!
生活>
OnPubLife("
生活杂志"
publicSubScriber(stringname)
publicvoidReceive(stringmagazineName)//在事件订阅者中定义事件处理程序
Console.WriteLine(name+"
已经收到"
+magazineName);
SubScriberzs=newSubScriber("
Pub.OnPubComputer+=newPublisher.PubComeputer(zs.Receive);
SubScriberls=newSubScriber("
Pub.OnPubComputer+=newPublisher.PubComeputer(ls.Receive);
Pub.OnPubLife+=newPublisher.PubLife(ls.Receive);
Pub.IssueComputer();
Pub.IssueLife();
一年以后"
Pub.OnPubComputer-=newPublisher.PubComeputer(ls.Receive);
五、事件的四个步骤
在事件发行者中定义一个事件
在事件发行者中触发事件
在事件订阅者中定义事件处理程序
向事件发行者订阅一个事件
六、.NetFramework的事件设计准则
(1)事件的命名准则使用pascalcasing命名方式
(2)声明delegate时,使用void类型当作返回值,eventName事件的事件委托是eventNameEventHandler,事件接受两个传入参数,一律命为sender与e
publicdelegatevoidEventNameEventHandler(objectsender,EventNameArgse);
(3)定义一个提供事件数据的类。
对类以EventNameEventArgs进行命名,从System.eventArgs派生该类,然后添加所有事件特定的成员
(4)如果事件不需要传递任何数据,也要声明两个参数
e参数可以直接使用系统提供的System.EventArgs类。
如果需要传递数据,则要从System。
EventArgs继承一个类,并把数据放在里面。
PublicdelegatevoidEventNameEventHandler(objectsender,EventArgse);
PubliceventEventNameEventHandlerEventName;
(5)在引发事件的类中提供了一个受保护的方法。
以OnEventName进行命名。
在该方法中引发该事件
protectedvirtualvoidOnEventName(EventArgse)
if(EventName!
=null)
EventName(this,e);
}}
(10)
usingSystem.Collections.Generic;
usingSystem.Text;
classPubEventArgs:
EventArgs
publicPubEventArgs(stringm_magazineName,DateTimem_pubDate)
this.magazineName=m_magazineName;
this.pubDate=m_pubDate;
privatereadonlystringmagazineName;
publicstringMagazineName
get{returnmagazineName;
privatereadonlyDateTimepubDate;
publicDateTimePubDate
get{returnpubDate;
classPubliser
publicdelegatevoidPubComputerEventHandler(objectsender,PubEventArgse);
publicdelegatevoidPubLifeEventHandler(objectsender,PubEventArgse);
publiceventPubComputerEventHandlerPubComputer;
publiceventPubLifeEventHandlerPubLife;
protectedvirtualvoidOnPubComputer(PubEventArgse)
if(PubComputer!
PubComputer(this,e);
protectedvirtualvoidOnPubLife(PubEventArgse)
if(PubLife!
PubLife(this,e);
publicvoidIssueComputer(stringmagazineName,DateTimepubDate)
{
发行"
OnPubComputer(newPubEventArgs(magazineName,pubDate));
publicvoidIssueLife(stringmagazineName,DateTimepubDate)
+magazineName);
OnPubLife(newPubEventArgs(magazineName,pubDate));
classSubScriber
this.name=name;
publicvoidRecevice(objectsender,PubEventArgse)
Console.WriteLine(e.PubDate+"
"
+name+"
+e.MagazineName);
Publiserpub=newPubliser();
pub.PubComputer+=newPubliser.PubComputerEventHandler(zs.Recevice);
pub.PubComputer+=newPubliser.PubComputerEventHandler(ls.Rec
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C# 第十 三讲 事件 老师 讲义