C#事件订阅发布实现原理详解
作者:David Huang 时间:2022-10-15 20:36:35
我们用一个简单的例子,来说明一下这种消息传递的机制。
有一家三口,妈妈负责做饭,爸爸和孩子负责吃。。。将这三个人,想象成三个类。
妈妈有一个方法,叫做“做饭”。有一个事件,叫做“开饭”。做完饭后,调用开发事件,发布开饭消息。
爸爸和孩子分别有一个方法,叫做“吃饭”。
将爸爸和孩子的“吃饭”方法,注册到妈妈的“开饭”事件。也就是,订阅妈妈的开饭消息。让妈妈做完饭开饭时,发布吃饭消息时,告诉爸爸和孩子一声。
这种机制就是C#中的,订阅发布。下面我们用代码实现:
class Program
{
public static void Main(string[] args)
{
//实例化对象
Mom mom = new Mom();
Dad dad = new Dad();
Child child = new Child();
//将爸爸和孩子的Eat方法注册到妈妈的Eat事件
//订阅妈妈开饭的消息
mom.Eat += dad.Eat;
mom.Eat += child.Eat;
//调用妈妈的Cook事件
mom.Cook();
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
public class Mom
{
//定义Eat事件,用于发布吃饭消息
public event Action Eat;
public void Cook()
{
Console.WriteLine("妈妈 : 饭好了");
//饭好了,发布吃饭消息
Eat?.Invoke();
}
}
public class Dad
{
public void Eat()
{
//爸爸去吃饭
Console.WriteLine("爸爸 : 吃饭了。");
}
}
public class Child
{
public void Eat()
{
//熊孩子LOL呢,打完再吃
Console.WriteLine("孩子 : 打完这局再吃。");
}
}
运行结果:
当爷爷奶奶来做客了怎么办呢?和爸爸孩子一样,写个Eat方法,同样注册到妈妈的开饭事件就好了。
来源:https://www.cnblogs.com/David-Huang/p/5150671.html
标签:C#,事件,订阅,发布
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
SpringBoot Validation提示信息国际化配置方式
2021-08-21 09:27:32
![](https://img.aspxhome.com/file/2023/8/67158_0s.png)
Linux下Hadoop 2.7.3 安装搭建过程
2023-11-08 05:13:59
![](https://img.aspxhome.com/file/2023/0/58870_0s.png)
java序列化与反序列化的使用方法汇总
2022-02-27 14:47:25
android View 绘制完成监听的实现方法
2023-08-06 20:47:05
详解C#如何实现读写ini文件
2022-02-04 23:15:27
![](https://img.aspxhome.com/file/2023/9/82139_0s.png)
解决springboot配置logback-spring.xml不起作用问题
2022-09-10 11:21:24
![](https://img.aspxhome.com/file/2023/8/64488_0s.png)
C# using语法糖图文详解
2023-08-05 02:57:36
![](https://img.aspxhome.com/file/2023/0/75590_0s.jpg)
Java设计模式之工厂模式案例详解
2023-11-27 20:08:03
![](https://img.aspxhome.com/file/2023/2/60342_0s.png)
浅谈C#六大设计原则
2023-05-02 16:29:58
Java编程实现统计一个字符串中各个字符出现次数的方法
2023-01-24 18:02:20
![](https://img.aspxhome.com/file/2023/3/84173_0s.jpg)
浅谈Java中向上造型向下造型和接口回调中的问题
2023-11-09 13:51:46
![](https://img.aspxhome.com/file/2023/1/59151_0s.jpg)
Java集合之Map接口的实现类精解
2023-10-07 15:10:37
![](https://img.aspxhome.com/file/2023/3/63653_0s.png)
Java系统的高并发解决方法详解
2021-08-23 08:39:50
Java原生服务器接收上传文件 不使用MultipartFile类
2023-11-09 19:31:36
Java中lambda表达式的基本运用
2023-09-09 08:02:36
![](https://img.aspxhome.com/file/2023/4/83134_0s.png)
java二叉查找树的实现代码
2022-08-12 02:36:43
Java如何基于ProcessBuilder类调用外部程序
2023-11-27 20:19:57
![](https://img.aspxhome.com/file/2023/0/59210_0s.png)
C#中利用Lotus notes公共邮箱发送邮件的方法
2023-10-02 03:00:12
Java 详解循环屏障CyclicBarrier如何实现多线程分段等待执行完成
2022-02-16 04:50:49
springboot如何静态加载@configurationProperties
2021-12-13 16:20:13