您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 第5章-基于事件驱动的程序设计
1.NET程序设计杨剑yang_jian03@126.com2C#程序设计语言第一章:.NET与C#概述第二章:面向对象程序设计第三章:集合、索引器与泛型第四章:程序调试与异常处理第五章:基于事件驱动的程序设计第六章:Windows程序设计技术第七章:C#数据库编程技术第八章:文件操作与编程技术第九章:多线程和异步编程第五章基于事件驱动的程序设计4本章目标掌握事件的概念,理解事件处理的机制理解委托的概念,掌握委托的声明、实例化与使用方法了解多路广播等概念掌握事件的声明、订阅和引用理解事件驱动编程的思想,掌握事件编程方法5委托的概念委托:又名“代理”,是一种引用型的数据类型,是对方法的抽象和封装。和类具有一定的相似性:对象定义类实例化引用对象方法定义代理实例化调用方法类是对相同对象的抽象和封装,代理?实现对具有相同方法签名的方法的封装。相同的:返回值类型相同的参数表6委托委托的声明publicdelegateintCall(intx,inty);委托的实例化[访问修饰符]delegate返回值类型委托名([参数列表]);就表示声明了一个名为Call的委托,可以用来引用任何具有两个int型的参数且返回值也是int型的方法委托类型委托变量名=new委托型构造函数(委托要引用的方法名)intAdd(intx,inty){returnx+y;}intAverage(intx,inty){return(x+y)/2;}Calla=newCalculate(Add);Callb=newCalculate(Average);7委托Multiply(int,int){….}Divide(int,int){….}在运行时确定调用哪种方法代理和方法必须具有相同的签名---publicdelegateintCall(intnum1,intnum2);---8定义委托classDelegates{//委托定义publicdelegateintCall(intnum1,intnum2);classMath{publicintMultiply(intnum1,intnum2){returnnum1*num2;}//乘法方法publicintDivide(intnum1,intnum2){returnnum1/num2;}//除法方法}staticvoidMain(string[]args){//代理的对象CallobjCall;MathobjMath=newMath();//Math类的对象//将方法与代理关联起来objCall=newCall(objMath.Multiply);result=objCall(5,3);//将代理实例化System.Console.WriteLine(结果为{0},result);}将方法与代理关联起来多路广播与委托的组合C#允许使用一个委托对象来同时调用多个方法,当向委托添加更多的指向其他方法的引用时,这些引用将被存储在委托的调用列表中,这种委托就是多路广播委托实现多路广播的方法有两种:一是通过“+”运算符直接将两个同类型的委托对象组合起来;二是通过“+=”运算符将新创建的委托对象添加到委托调用列表中。另外,还可以使用“−=”运算符来移除调用列表中的委托对象。10小结委托的概念如何定义委托intAdd(inta,intb){returna+b;}intSub(inta,intb){returna-b;}Callobj;obj=newCall(Add);obj=newCall(Sub);intr=obj(5,3);委托是一种引用方法的类型,可以实现对有相同方法签名的方法的封装。可以向委托对象中添加一个或多个方法,当委托被调用时,委托列表中所有的方法被顺序调用一次。delegateintCall(inta,intb);如何使用委托Callobj;Obj+=newCall(Add);Obj+=newCall(Sub);intr=obj(5,3);11基于事件的编程思想各种事件不同的事件人们有不同的反应悲痛对不同的事件有不同的事件处理机制兴奋恐慌12基于事件的编程思想事件源报警系统事件处理机制6.113基于事件的编程思想结构化程序设计—过程驱动模型main(){……while(发生事件){//调用事件处理程序EventProcessor();}OtherFuncation();……}EventProcessor(){//处理事件}OtherFuncation(){//其它程序段}没事发生发生了事件为什么没人通知我呢?6.114基于事件的编程思想结构化程序设计—过程驱动模型main(){……while(!发生事件){//调用其它程序段OtherFuncation();}EventProcessor();……}EventProcessor(){//处理事件}OtherFuncation(){//其它程序段}没事发生发生了事件怎么还不该我执行啊!6.115基于事件的编程思想抢答者宣布人抢答者“请听题~”集中注意力聆听其他人事件源事件的发布者事件的订阅人未订阅该事件•定义事件•为对象订阅该事件•将发生的事件通知给订阅人6.116基于事件的编程思想面向对像程序设计—事件驱动模型完整的事件处理系统由3大要素构成事件源触发事件的对象,又称事件的发送者或事件的发布者侦听器能侦听到事件的产生,并通知订阅者事件处理程序当事件发生时对事件进行处理,又称事件函数或事件方法,包含事件处理程序的对象称为事件的接收者或事件的订阅者6.117基于事件的编程的步骤定义事件事件源事件处理程序订阅者订阅发布者触发通知侦听器执行6.218.Net的事件处理鼠标单击定义Click事件事件源事件处理程序:搜索并打开结果页订阅者:Web程序订阅发布者:按钮触发通知侦听器执行.NET鼠标单击事件的来源:发布者事件的相关信息6.219定义事件在C#中,事件实际上就是一个委托类型的变量回顾:委托委托6.220定义事件定义事件语法publicdelegatevoiddelegateMe(objectsender,EventArgse);[访问修饰符]event委托名事件名;委托关键字委托名事件源事件相关信息publiceventdelegateMeeventMe;事件关键字委托名事件名classFireEventArgs:EventArgs{……}定义事件相关信息类classFire{//声明火灾的委托类型publicdelegatevoidFireHandler(objectsender,FireEventArgse);//声明火灾事件publiceventFireHandlerOnFire;}定义事件6.221订阅事件订阅事件示例classControlFire{Firefire;publicControlFire(){//订阅火灾事件fire.OnFire+=newFire.FireHandler(fire_OnFireOne);fire.OnFire+=newFire.FireHandler(fire_OnFireTwo);}//火灾处理程序privatevoidfire_OnFireOne(objectsender,FireEventArgse){……}privatevoidfire_OnFireTwo(objectsender,FireEventArgse){……}}订阅事件6.222触发事件触发事件示例publicvoidDictograph(){if(事件发生){FireEventArgse=newFireEventArgs();……if(OnFire!=null){OnFire(this,e);}}}触发事件定义事件相关信息6.223小结事件处理系统构成要素事件源侦听器事件处理程序事件处理编程定义事件publicdelegatevoiddelegateMe(objectsender,EventArgse);publiceventdelegateMeeventMe;订阅事件fire.OnFire+=newFire.FireHandler(fire_OnFireOne);privatevoidfire_OnFireOne(objectsender,FireEventArgse){……}触发事件OnFire(this,e);6.224讨论如何设计事件处理系统程序演示确定:事件源,事件处理程序,侦听器设计程序:定义事件;订阅事件;触发事件6.225总结【重点】1.委托的定义与使用;2.委托的多路广播;3.C#中事件的声明与使用以及Windows程序中的事件。【难点】1.委托的多路广播;2.C#中事件的声明与使用。
本文标题:第5章-基于事件驱动的程序设计
链接地址:https://www.777doc.com/doc-4711293 .html