《C#程序设计》课件第7章委托与事件_第1页
《C#程序设计》课件第7章委托与事件_第2页
《C#程序设计》课件第7章委托与事件_第3页
《C#程序设计》课件第7章委托与事件_第4页
《C#程序设计》课件第7章委托与事件_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

委托与事件思政目标:

☞科学观念对学习有决定性作用,通过编程培养科学观念

☞通过委托与事件的学习,提高抽象思维能力技能要求:

☞掌握委托与事件的基本概念

☞了解委托与事件的使用

☞了解匿名方法与普通方法的区别、匿名类的创建Lambda表达式的使用实践目标:

☞根据示例,对所学的概念进行验证

☞熟练应用面向对象方法实现编程设计第7章委托事件匿名方法Lambda表达式委托01PART委托的作用在于:可以将方法引用封装在委托对象内,然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法。通俗的说就是:通过委托,我们可以把方法当成参数传递。委托和类相同,是一种用户自定义的类型。类的表示是通过数据和方法进行集合,而委托则持有一个或多个方法,以及一系列预定义操作。委托的使用要注意以下五个内容:(1)声明一个委托类型。委托声明和方法声明相似,只是没有实现块。(2)使用该委托类型声明一个委托变量。(3)调用委托与调用方法的语法相同。调用委托时,其包含的每一个方法都会被执行。(4)创建委托类型的对象,赋值给委托变量。其中,新的委托对象包括指向某个方法的引用。这个方法和第一步定义的签名和返回类型一致。(5)委托对象可增加其他方法。这些方法必须与第一步中定义的委托类型有相同的签名和返回类型。委托的定义委托1.声明委托委托的使用委托是类型,与类的声明相同,委托类型必须在被用来创建变量以及类型的对象之前声明。委托的声明看上去与方法的声明很相似,有返回类型和签名。返回类型和签名指定了委托接受的方法的形式。委托的声明与方法的声明不同之处是,委托以delegate关键字开头,且没有方法主体。委托此句声明一个委托,其中,MyDelegate即为该句所声明的委托名字。该委托能够指向的方法签名特性是:返回值为int类型,两个参数,且两个参数都是int类型。若参数类型不同,则需要考虑参数的顺序问题。2.实例化委托的使用委托是引用类型,因此有引用和对象。在委托类型声明之后,我们可声明变量并创建类型的对象委托经过此句的实例化,pMethod以后可以代替myMethod()方法来执行任务。3.调用委托的使用调用委托和调用方法类似。用于调用委托的参数将会用于调用列表中的每一个方法,其格式如下:pMethod(参数列表);委托3.调用委托的使用委托多播委托委托多播委托就是可以引用的多个函数的委托,其本质是对System.MulticastDelegate类(为System.Delegate的子类)的继承和实现。一般情况下,多播委托的返回值为void。另外,虽然使用多播委托可以按照顺序调用多个方法,但最终的结果只能是从其所调用的最后一个方法中得到。多播委托给委托添加方法调用的方式是使用运算符"+"和"+=",同样,给委托删除方法调用的方式是使用运算符"-"和"-="多播委托委托多播委托和单播委托的调用方式一样,但在执行时,多播委托会依次执行所有指向的方法序列。例如,将上面的代码依次执行method1、method2和method3从执行结果可以看到:(1)多播委托中各个方法都会被执行,且执行顺序与+=的操作顺序一样。(2)多播委托如果有返回值,则只返回最后一个函数的执行结果事件02PART事件事件的使用方法和委托相关,下面通过一个例子来了解事件。校园运动会的长跑项目中,裁判员一般是通过打枪的方式表示比赛开始,参加长跑的同学在听到枪声后起跑,其中枪声是事件,裁判员通知该事件发生,而参加长跑的同学在听到枪声后起跑就是这个事件发生后的动作。另外,不参加长跑的同学对枪声不会有反应。在此过程中,有两个主要方:产生事件的对象(裁判员)和接收事件的对象(参加该项目的同学),其中,产生事件的对象也称为事件发生者或事件触发者,接收事件的对象也称为事件订阅者或事件接收者事件事件的使用在所有类之外为事件定义一个public修饰的委托,由于事件为多播委托,故定义时返回类型应为void事件1.定义事件委托事件的使用使用事件,需要有事件触发的源头,故应先定义一个事件触发类,然后在该类内部使用event关键字与上述委托一起定义一个public的事件事件2.定义事件触发类(用于产生事件)该类中,当特定的动作发生或消息到达时就触发所定义的事件,一般用一个方法完成事件触发。事件的使用MyEventArgs可以为自定义参数类型,也可以为内置类型,当然也可以不要该参数。这样,外界即可通过如图下来触发事件事件2.定义事件触发类(用于产生事件)eventSrcInstance即eventSrcClass实例化对象。事件的真正触发代码即在该方法中。一般地,发生事件时,第一个参数为事件产生类(触发类),第二个参数为System.EventArgs类或其派生类类型,该类可用于向事件接收方传递一些数据,其一般样式如下事件的使用someData为EventArgs类的子类的实例化对象。若无须向事件接受方传递任何参数,则可以使用事件2.定义事件触发类(用于产生事件)在事件触发方法中,完成事件触发处理的代码如下事件的使用事件触发类的核心代码事件2.定义事件触发类(用于产生事件)事件的使用一般该类为主要业务类,即主要功能在此类中。在该类中需准备一个事件处理方法,该事件处理方法必须符合委托所声明的方法签名。一般地,用于处理事件的方法名称习惯以On开头事件3.定义事件接收类(用于处理事件)定义事件触发类的实例,然后完成事件订阅,表明事件发生后,将由哪个方法来处理。三类事件定义一个无参数的委托事件1.无参类型三类事件下面定义一个带参数的委托类型,参数类型使用EventArgs类事件2.带参类型三类事件事件2.带参类型该示例使用的是有参数的事件,不过事件的第二个参数是内置的EventArgs类型,并且没有传入数据。另外,从示例中也可以看出事件基于多播委托,所以事件是委托的一种特例。所有订阅了事件的处理方法在事件发生后,都被通知到并且都完成执行。三类事件事件3.自定义参数类型除上述两种方式外,还可以通过EventArgs派生自己的参数类型,并在事件中使用它来进行数据的传递,此时需要从EventArgs类派生一个符合自己要求的类,用作参数类型三类事件事件3.自定义参数类型根据前面所讲述的方法来定义事件及相关类(1)事件触发类决定发送事件的时间,事件接收者决定执行响应事件的操作。(2)没有订阅者的事件不会被触发。(3)一个事件可以有多个订阅响应者,一个订阅者可以响应多个事件。(4)具有多个订阅者的事件一旦被触发,就会同步调用多个事件处理程序。(5).NET中的事件是基于EventHandler委托和EventArgs参数的。匿名方法03PART匿名方法匿名方法匿名方法就是没有名称的方法,除此之外,它和普通方法没有什么区别。匿名方法使用时是通过delegate修饰。匿名方法声明的一般形式如下:委托名委托实例对象=delegate(参数1,参数2,…){方法体;};匿名方法匿名方法匿名方法仅适用于小代码量的情况,它可以带参数。使用匿名方法时,可以在有需要的时候直接写方法体,不必事先声明一个与委托匹配的方法。除上述内容以外,使用匿名方法时,还需要注意如下四点:(1)(参数1,参数2,…)用于给匿名方法传递参数。(2)匿名方法的参数列表,即(参数1,参数2,…)中各个参数不能省却参数类型。(3)匿名方法本身不能脱离赋值环节,即“delegate(参数1,参数2,…){方法体;};”是非法的。(4)如果没有参数列表,即形如“delegate{方法体;};”时,该匿名方法可以赋给任意委托对象。Lambda表达式04PARTLambda表达式Lambda表达式Lambda表达式本质上是匿名方法,它可以减少代码量,使代码更加简洁、优美。方法需要依附于委托,故Lambda表达式的书写也要遵从委托的“规定”。其一般形式如下:(参数列表)=>{语句序列}在使用Lambda表达式时,需要注意以下六点。(1)参数列表中的参数数目并不固定,具体需要几个参数是由相应的委托确定。另外,在参数列表中只有一个参数时,可以省去列表外侧的一对括号(),否则不可以。(2)如果编译器能够推断出参数的类型,则参数列表中可以不加参数的类型,但需要有参数名称。(3)如果委托有返回值类型,则Lambda表达式也必须返回相同类型的值。(4)委托声明时对参数使用了ref或out修饰,则Lambda表达式中也必须带上ref或者out,且不能省去参数类型。(5)当右侧的语句序列中只有一条语句时,大括号可以省去,否则不可以。(6)右侧语句序列有返回值时,必须使用return语句;若右侧语句序列中只有一个语句时,可以省去return语句。Lambda表达式Lambda表达式Lambda表达式的语法上面的Lambda表达式等价于Lambda表达式Lambda表达式2.书写三个Lambda表达式Lambda表达式Lambda表达式3.赋值因为Lambda表达式是匿名方法,所以Lambda表达式可以像匿名方法一样赋给委托实例对象这个问题也可以通过下面这种方法理解:委托表达式就是一个方法,如:“(x,y)=>x+y;”是一个Lambda表达式,那它就是一个方法,假如该方法记为A,即“A=(x,y)=>x+y;”(类似

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论