- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
轻松学之委托事和件表达式
第13章 委托、事件和Lambda表达式委托是一种封装方法的特殊机制。委托可以帮助程序员更灵活的调用相应的方法。基于该机制,事件可以针对应用程序触发执行某些代码。本章将详细讲解委托和事件相关知识。同时,还将详细讲解特殊的委托Lambda表达式。13.1 委托委托派生于System.MulticastDelegate类,而System.MulticastDelegate类又派生于System.Delegate。委托是一个能够引用方法的对象。因此,在创建委托时,实际创建的是一个存储方法引用的对象。由于通过此引用可以调用相应的方法,所以委托能够调用他所指向的方法。在程序运行期间,同一个委托能够用于调用不同的方法,只要改变它引用的方法便可。因此,委托调用的方法不是在编译时确定的,而是在运行时确定。13.1.1 声明委托关键字delegate可用于声明委托。声明委托的通用形式如下图所示。其中,ret-type是委托将调用的方法的返回值类型。name是委托的名称。parameter-list指定委托调用的方法所需的参数。13.1.2 创建委托因为委托是一个类,所以用new关键字创建委托的实例。委托构造函数只有一个参数,即添加到该委托中的第一个方法。其常用格式如下图(左)所示。其中,AClass表示需要实例化类的名称。ac1表示实例化对象。abc表示要引用的构造函数。new是关键字。委托的实例化还有一种不需要关键字new的方法。其格式如上图(右)所示。与常用格式不同的是没有关键字new,其他都相同。【示例13-1】以下代码用不同的方法初始化一个委托。这里虽然有四种方法,但是实际意义是相同的,唯一不同的便是其格式不同。第一种方法有new关键字,并且参数为类加方法名。第二种方法是其常用格式,有new关键字,参数为方法。第三种方法是不需要new关键字的,并且直接加方法名。第四种方法是先实例化类的一个对象,然后用对象加方法名。平常我们的方法或者函数只能用来传参数,有的时候一个方法可能需要另一个方法的支持,所以我们可以定义个委托来传这个方法。换句话说,委托的作用就是用来传递方法的。【示例13-2】以下程序创建了一个委托MyDelegate,在请求用户输入时使用它模拟Console.ReadLine()函数。其中,函数Console.ReadLine()的返回值类型为string类型,无参数。13.1.3 多播委托多播委托是指允许创建方法的调用列表或者链表的能力。当调用多播委托时,这些方法均会自动执行。如果委托具有返回值,则将列表中最后一个方法的返回值用作整个委托调用的返回值。方法链表的创建:首先实例化一个委托,然后使用“+”或“+=”运算符为链表添加方法。在移除一个方法的时候,可以使用“-”或“-=”运算符。【示例13-3】以下程序使用多播委托对字符串进行操作,返回类型为void。其中,使用ref参数向调用程序返回改变后的字符串。我们可以清楚的从程序运行流程图中看到,多播是自动顺序执行的所有方法。13.1.4 逆变和协变逆变指的是函数引用的每个参数的类型必须与委托对应参数的类型相同,或者是委托的对应参数的派生类型。协变指的是委托的返回类型必须与函数引用的返回类型相同,或者是函数引用的返回类型的派生类型。逆变和协变的格式下图所示。【示例13-4】以下代码同时演示了逆变和协变的用法。程序中逆变与协变的对应如下图所示。注意:代码 bop = (B)top(bop);必须进行强制类型转换。否则会出现错误。13.2 事件事件构建在委托的基础上。事件是一种信号机制,它在某些操作发生时自动地发出通知。事件定义为对象发送的消息,以发信号通知操作的发生。13.2.1 声明事件声明一个事件时,方式与声明一个字段非常相似。因为事件设计是随同委托使用的,所以事件的类型必须是一个委托。事件声明的格式如下图所示。其中,event是关键字,其必须在声明的前面。delegateTypName是委托类型名称。eventName是事件的名称。【示例13-5】以下代码演示了如何声明事件。13.2.2 订阅事件发送(或引发)事件的类称为“发行者”,接收(或处理)事件的类称为“订阅者”。对于每个发布者,可以有0个或多个订阅者。同时,一个订阅者可以订阅多个不同的事件。订阅事件都使用“+=”运算符为事件对象添加事件。其格式如下图所示。 【示例13-6】以下代码为AbcEvent事件订阅事件。13.2.3 取消订阅事件“-=”操作符用于取消订阅。“-=”操作符能将一个方法从事件的内部方法集合中移除。其格式如下图所示。13.2.4 引发事件和委托相似,可以把一个事件当做方法来调用,从而引发这个事件。引发一个事件后,订阅该事件的方法会被依次调用。【示例13-7】以下代码中,Prog
有哪些信誉好的足球投注网站
文档评论(0)