委托与事件

发布 2019-06-01 03:44:35 阅读 9856

事件与委托趣谈。

事件与委托似乎很难以理解,这是因为它们的使用方式与常用的编码有很大的差别,例如通常编写的都是同步**,调用一个类型的方法,会即刻出现方法执行的结果,这是符合逻辑的。但在某些情况中,同步**未必满足需求,拿公共汽车来打个比方,如果交通管制中心希望每一辆公车到达一个站点时都发送给自己一个信号以便自己能够随时掌握交通状况,使用同步**,公汽对象肯定需要调用管制中心对象,这样就出现了我们一直不愿意看到的情况:两个类型紧密地耦合在一起。

既然要其它类型对自己的行为作出反应,亲自调用其类型的方法似乎不可避免,在同步**中,很难避免这种紧密的类型调用关系。

另一个差别是在一般情况下,我们只将属性作为参数传递给方法,而很少会考虑将一个方法传递给另一个方法。

我们抛弃各种c#参考书中桀骜难懂的事件与委托概念,设想一个情景来理解事件与委托的使用:有一家it公司,董事长不希望自己的雇员在上班时间玩游戏,但又不可能每时每刻都盯着每个雇员,因此,他希望使用一种新的方式实现监视雇员的效果:如果有雇员违反规定,某个设备或专门的监查人员将自动发出一个消息通知他,董事长只需要在事情发生时进行处理。

因此,这个用例实际上是两种类型——董事长类与雇员类——之间的交互,下面的**将给读者展示如何使用委托与事件机制实现这种交互:

首先,我们需要在董事长类与雇员类之间定义一个委托类型,用于传递两者之间的事件,这个类型就是一个监视设备或专门负责打小报告的监查人员:

public delegate void delegateclasshandle();

定义一个委托的过程类似方法的定义,但它没有方法体。定义委托一定要添加关键字delegate。由于定义委托实际上相当一个类,因此可以在定义类的任何地方定义委托。

另外,根据委托的可见性,也可以添加一般的访问修饰符,如public、private和protected。

委托的返回值类型为void,这并非表示委托类型本身带有返回值,该返回值类型是指委托的目标函数类型,即它委托的一个事件处理函数返回值是void类型。

新建一个雇员类employee,其**如下:

public class employee

public event delegateclasshandle playgame;

public void games()

它的定义方式也很特殊,首先必须使用关键字event,表示playgame是一个事件,同时还必须声明该事件的委托类型为delegateclasshandle,即将来由该类型的委托对象负责通知事件。

如果有雇员开始玩游戏,它将执行games方法,而只要该方法一被调用,就会触发一个事件playgame,然后董事长就会收到这个事件的消息——有人在玩游戏了。

董事长类**如下,他有一个方法notify用于接收消息:

public class admin

public void notify()

employee的playgame事件如何与admin的notify方法关联起来呢?只需通过事件绑定即可实现,具体过程如下列**:

employee employee = new employee();

admin admin = new admin();

+= new delegateclasshandle(

请大家注意事件绑定的**:

+= new delegateclasshandle(

通过delegateclasshandle将两个类的交互进行了绑定,当方法调用后,触发playgame事件,而该事件将被委托给admin的notify方法处理,通知董事长有雇员在上班时间玩游戏。

但董事长并不满足这种简单的通知,他还想知道究竟是谁在上班时间违反规定。显然,现在委托对象必须传递必要的参数才行,这个要求也可以很容易地办到。事件的参数可以设置为任何类型的数据,在。

net框架中,还提供了事件参数基类eventargs专门用于传递事件数据。

从该eventargs类派生一个自定义的事件参数类customeeventargs,这个类型将携带雇员姓名和年龄信息:

public class customeevetnargs : eventargs

string name =

int age = 0;

public customeevetnargs()

public string nameset

public int ageset

修改委托类型delegateclasshandle的定义,让其携带必要的参数:

public delegate void delegateclasshandle(object sender, customeevetnargs e);

雇员类的**修改后如下:

public class employee

private string _name;

public string nameset

private int _age;

public int ageset

public event delegateclasshandle playgame;

public void games()

在games方法中,首先新建一个customeeventargs对象,然后设置了必要的属性name和age。

董事长的通知方法也必须相应地进行修改:

public class admin

public void notify(object sender, customeevetnargs e)

将两个类型对象进行关联的**也需要进行相应的修改:

employee employee = new employee();

= "mike";

admin admin = new admin();

+= new delegateclasshandle(

修改后的**运行的结果是,当mike调用games方法玩游戏时,会自动触发playgame事件,而该事件携带相关信息通知admin,后者的notify方法将接收到数据并输出“mike is 25”,告诉董事长是mike,25岁,正在上班时间玩游戏。

委托是可以多路广播(mulitcast)的,即一个事件可以委托给多个对象接收并处理。在上面的用例中,如果有另一位经理与董事长具有同样的癖好,也可以让委托对象将雇员的playgame事件通知他。

首先定义经理类:

public class manager

public void notify(object sender, customeevetnargs e)

经理manager类型的notify方法与admin一致,他也接受到相应的信息。

委托的多路广播绑定的方法仍然是使用+=运算符,其方法如下面的**所示:

employee employee = new employee();

= "mike";

admin admin = new admin();

manager manager = new manager();

+= new delegateclasshandle(

+= new delegateclasshandle(

C委托与事件

c 委托与事件。一个例子 实现一个定时器,到某个时间后,通知tom去抓老鼠,通知jerry躲起来。code 不使用委托的实现方式,c 声明一个猫的类。class cat private string name public cat string name public string getname ...

委托租房委托书

五 受托人代表委托人签署的一切有关文件,委托人均予以承认,由此在法律上产生的责任一概由委托人承担 本委托为不可撤消之委托。本委托无论委托人发生婚变或其他意外等等情况,均长期有效 本委托经委托人签字并按手印后生效 本委托自上述所有事项全部办理完毕后自行失效。委托人 委托日期 年月日 附件 1 委托人房...

“虐童事件”反思

虐童事件 反思。10月24日,浙江温岭一所民办幼儿园的90后女教师颜艳红虐童事件引起争议。虽然事后颜艳红已被辞退,并被公关机关刑拘,且其所在的幼儿园园长已被免职。但该女教师的行为令我们不少家长开始质疑把孩子交到幼儿园,到底能不能放心?花儿怒放需共同努力。教师被称为人类灵魂的工程师,是天底下最神圣的职...

颜艳红事件心得

今天会议室中我们看了关于颜艳红的事件一张张触目惊心的 展现在我们面前,孩子那痛苦的表情无助的表情我真的想问问这些难道你都没有看到吗?孩子是那么的天真那么的可爱,一张张笑脸如此的美丽你怎忍心呢?作为一位老师你就没有一点职业道德吗?但是你好像也是无证的,但至少你进入了这个行业你就该有基本的道理礼仪和约束...

委托送达函

35 委托送达函样式。人民法院。委托送达函。执 字第 号。人民法院 我院执行的 写明当事人姓名或名称 案由 一案,现委托你院送达有关执行法律文书。随函寄去 写明生效法律文书的制作机关 日期 字号和名称 份,送达回证 件,请在收到后 日内代为向 送达,并将送达回证及时寄回我院。附执 字第 号 执行法律...

工程造价咨询委托书委托书

甲方 委托人 佛山市工程造价咨询 乙方 被委托人 在自愿 诚信 公平的前提下,经过甲乙双方协商一致,委托人出具本委托书。本委托书约定如下 1 甲方委托乙方提供银畔丽苑 新松20号地商品房 工程造价咨询服务,主要服务内容是编制工程预结算,负责与建设单位和施工单位核对相关工程量,解释套价依据等 2 由于...

快递突发事件应急预案

一 目的 对突发性事件立即启动应急预案响应,减少损失,消除负面影响,尽快恢复正常生产。二 适用范围 公司各部门及全体员工。三 应急预案等级 1 特级预案 特别严重 因不可抗拒的自然灾害,重大道路交通事故,经营场所火灾 员工工伤 食物中毒 群体事件 恐怖事件,发现寄送影响 的快件,与外国友人发生摩擦等...

突发事件总体应急预案

关于下发 金马油田开发公司突发事件应急预案 的。通知。各区 所,大队 站 机关各科室 直属部门 为了贯彻 中国石油辽河油田公司突发事件总体应急预案 中华人民共和国突发事件应对法 中华人民共和国安全生产法 及其它法律 法规及有关文件的要求,保护单位员工的生命安全,减少单位财产损失,使事故发生后能快速 ...