由浅入深理解C#中的事件.docx

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

由浅入深理解C#中的事件

前面介绍了C#中的委托,事件的很多部分都与委托类似。实际上,事件就像是专门用于某种特殊用途的简单委托,事件包含了一个私有的委托,如下图所示:

有关事件的私有委托需要了解的重要事项如下:

1、事件提供了对它的私有控制委托的结构化访问。我们无法直接访问该委托。

2、事件中可用的操作比委托要少,对于事件我们只可以添加、删除或调用事件处理程序。

3、事件被触发时,它调用委托来依次调用调用列表中的方法。

有关事件的概念

发布者(Publisher):发布某个事件的类或结构,其他类可以在该事件发生时得到通知。

订阅者(Subscriber):注册并在事件发生时得到通知的类或结构。

事件处理程序(eventhandler):由订阅者注册到事件的方法,在发布者触发事件时执行。

触发(rAIse)事件:调用(invoke)或触发(fire)事件的术语。当事件触发时,所有注册到它的方法都会被依次调用。

现在我们先来看一下最最原始的事件示例。其结构如下所示:

委托类型声明:事件和事件处理程序必须有共同的签名和返回类型,它们通过委托类型进行描述。

事件处理程序声明:订阅者类中会在事件触发时执行的方法声明。它们不一定有显示命名的方法,还可以是匿名方法或Lambda表达式。

事件声明:发布者类必须声明一个订阅者类可以注册的事件成员。当声明的事件为public时,称为发布了事件。

事件注册:订阅者必须订阅事件才能在它被触发时得到通知。

触发事件的代码:发布者类中触发事件并导致调用注册的所有事件处理程序的代码。

现在我们可以照着这个思路去写示例代码。

首先声明一个自定义的委托类型:

publicdelegatevoidMyDelegate();

该委托类型没有参数也没有返回值。

然后再写一个发布者类:

publicclassPublisher

publiceventMyDelegateMyEvent;

publicvoidDoCount()

for(inti=0;ii++)

Task.Delay(3000).Wait();

//确认有方法可以执行

if(MyEvent!=null)

//触发事件

MyEvent();

事件声明:

publiceventMyDelegateMyEvent;

事件声明在一个类中,它需要委托类型的名称,任何注册到事件的处理程序都必须与委托类型的签名和返回类型匹配。它声明为public,这样其他类和结构可以在它上面注册事件处理程序。不能使用对象创建表达式(new表达式)来创建它的对象。

一个常见的误解就是把事件认为是类型,事件其实不是类型,它和方法、属性一样是类或结构的成员。

由于事件是成员,所以我们不能在一段可执行的代码中声明事件,它必须声明在类或结构中,和其他成员一样。

事件成员被隐式自动初始化为null。

事件声明的图解如下所示:

触发事件:

//确认有方法可以执行

if(MyEvent!=null)

//触发事件

MyEvent();

也可以这样写:

//确认有方法可以执行

if(MyEvent!=null)

//触发事件

MyEvent().Invoke();

这两者是等效的,MyEvent();直接调用事件的委托,MyEvent().Invoke()使用显式调用委托的Invoke方法。

现在再看看订阅者类:

publicclassSubscriber

publicvoidEventHandler()

Console.WriteLine(${DateTime.Now}执行了事件处理程序

订阅者类中有一个EventHandler方法,与前面定义的委托类型的签名与返回值类型一致。

在看下主函数:

staticvoidMain(string[]args)

Publisherpublisher=newPublisher();

Subscribersubscriber=newSubscriber();

//订阅事件

publisher.MyEvent+=subscriber.EventHandler;

publisher.DoCount();

文档评论(0)

184****8785 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档