前言
大家好,我是阿辉。
在我们日常的软件开发工作中,很容易用到事件机制,简单举例就好比民国时期订阅报纸机制一样,当订阅者在报社订阅该报社发行的报纸一样,只需要告诉报社快递到哪里即可,每次当报社发报时,订阅人都会在同一时间地点收到订阅的报纸,不会出现遗漏等情况。
这也就是编程过程中事件所要解决问题。
那么我们一起来学习下在C#语言下,事件到底该如何实现?
什么是事件
以前在设计模式学习的过程中,了解到了订阅者/发布者模式,它解决的是当一个特定事件程序发生时,程序的其它部分得到该事件已经发生的通知。
在这种模式中,发布者定义了一系列程序的其他部分可能感兴趣的事件,其他类可以进行注册,以便在事件发生时发布者可以通知它们。这些订阅者通过向发布者提供一个方法来注册以获得通知,当事件发生时,发布者触发事件,然后执行订阅者提交的所有事件。订阅者就可以接收到消息通知。
事件有很多重要事项
- 发布者
发布某个事件的类或结构,其他类可以在该事件发生时得到通知。
- 订阅者
注册并在事件发生时得到通知的类或结构
- 事件处理程序
由订阅者注册到事件的方法,在发布者触发事件时执行。可定义在事件所在类,也可定义在不同的类中。
- 触发事件
调用(invoke)或触发(fire)事件的术语。当事件被触发时,所有注册到它的方法都将会被调用。
事件就像是专门用于某种特殊用途的简单委托。事件包含一个私有的委托。
事件的用法
这里需要特别强调一点,事件不是类型,它和方法和属性一样,事件是类或结构的成员。
那么就必须注意下面两点:
- 事件不能声明在可执行的代码中
- 它必须声明在类或结构中,和其他成员一样
- 事件成员被隐式自动初始化为null
BCL声明了一个叫做EventHandler的委托,专门用于系统事件。
下面列举一个比较简单的例子,就以报社和订阅者阿辉为例,当报社开始发报时,阿辉就会收到报纸。
报社(发布者)
delegate void Handler(); //1、声明委托
/// <summary>
/// 报社
/// </summary>
class NewspaperOffice
{
public event Handler StartPublishPaper; //2、创建事件并发布
public void Publish()
{
Console.WriteLine("已发布报纸!");
StartPublishPaper(); //3、触发事件,通知订阅者收报纸进行阅读
}
}
阿辉(订阅者)
/// <summary>
/// 阿辉 订阅者
/// </summary>
class AhuiPeople
{
public AhuiPeople(NewspaperOffice npo)
{
npo.StartPublishPaper += SubscriptinPaper; //4、订阅事件
}
void SubscriptinPaper()
{
Console.WriteLine("阿辉接收到报纸,开始阅读!");
}
}
static void Main(string[] args)
{
NewspaperOffice npo = new NewspaperOffice();
AhuiPeople ahuiPeople = new AhuiPeople(npo);
//报社发报
Console.WriteLine("报社计划开始发报!");
npo.Publish();
Console.ReadKey();
}
运行后结果如下:
寄语
人生短暂,我不想去追求自己看不见的,我只想抓住我能看得见的。
原创不易,给个关注。
我是阿辉,感谢您的阅读,如果对你有帮助,麻烦点赞、转发 谢谢。