本文仅作学习笔记与交流,不作任何商业用途,作者能力有限,如有不足还请斧正
1.什么是事件
在看前,牢记事件的本质还是委托(C# 委托-CSDN博客),仍旧是包裹函数的一种方式
在C#中,事件(Event)是一种特殊的委托类型,用于在对象之间传递消息或通知
事件通常用于实现发布-订阅模式(Publisher-Subscriber Pattern)
- 发布者(Publisher):包含事件定义的对象
- 订阅者(Subscriber):响应事件的对象
- 事件处理器(Event Handler):订阅者用来处理事件的方法
图示:先发布和订阅
后写好触发方法,就可以触发了
waring:事件只能在声明它的类内部触发:事件只能在声明它的类内部调用(或结构体内)
这意味着只有发布者类可以触发事件,而订阅者类只能订阅和响应事件
2.事件的发布订阅与触发 (事件监听)
事件的声明包括但不限于下面两种方式:
- //可以先定义一个委托,再定义事件
- delegate void D(int t);
- event D thisevent;
- //或者直接用c#定义好的委托直接定义事件
- event Action<int> thisevent1;
发布者
发布者类出一个事件和一个触发方法
- class Publisher {
-
-
- //这里是一个定义好的事件
- public event Action<int> thisevent;
-
- //这里是一个自定义的触发函数
- public void Tigger(int a)
- {
- if(thisevent!=null)
- {
- //已被订阅就触发事件
- thisevent(a);
- }
- else
- {
- //抛出异常
- throw new Exception("未订阅事件,你用个der!");
- }
- }
- }
订阅者
订阅者类出一个函数:
- class Subscriber
- {
- //这个就叫事件处理器,感觉完全没必要,就叫响应函数也行啊
- public void AnyFunction(int t)
- {
- Console.WriteLine("事件已触发,订阅者响应,验证码:"+t);
- }
- }
触发
- Publisher publisher =new Publisher();
- Subscriber subscriber =new Subscriber();
- //订阅
- publisher.thisevent += subscriber.AnyFunction;
- //触发
- publisher.Tigger(1);
如果中途因为什么原因给事件没有被订阅,那么就会抛出异常
- Publisher publisher =new Publisher();
- Subscriber subscriber =new Subscriber();
- //订阅
- //publisher.thisevent += subscriber.AnyFunction;
- publisher.thisevent += null;
- //触发
- publisher.Tigger(1);
总览
- Publisher publisher =new Publisher();
- Subscriber subscriber =new Subscriber();
- //订阅
- //publisher.thisevent += subscriber.AnyFunction;
- publisher.thisevent += null;
- //触发
- publisher.Tigger(1);
-
- class Publisher {
-
- #region 先定义委托再定义事件
- 可以先定义一个委托,再定义事件
- //delegate void D(int t);
- //event D thisevent;
- 或者直接用c#定义好的委托直接定义事件
- #endregion
- //这里是一个定义好的事件
- public event Action<int> thisevent;
-
- //这里是一个自定义的触发函数
- public void Tigger(int a)
- {
- if(thisevent!=null)
- {
- //已被订阅就触发事件
- thisevent(a);
- }
- else
- {
- //抛出异常
- throw new Exception("未订阅事件,你用个der!");
- }
- }
- }
- class Subscriber
- {
- //这个就叫事件处理器,感觉完全没必要,就叫响应函数也行啊
- public void AnyFunction(int t)
- {
- Console.WriteLine("事件已触发,订阅者响应,验证码:"+t);
- }
- }
更能体现事件监听,监听二字的另外一种“上锁”的方法,就是再给触发部分加一部分条件(自定义的Monitor函数就是一个简单直白的体现)
- Publisher publisher =new Publisher();
- Subscriber subscriber =new Subscriber();
- //订阅
- publisher.thisevent += subscriber.AnyFunction;
- //publisher.thisevent += null;
- //触发
- publisher.Monitor(5);
-
- class Publisher {
-
- #region 先定义委托再定义事件
- 可以先定义一个委托,再定义事件
- //delegate void D(int t);
- //event D thisevent;
- 或者直接用c#定义好的委托直接定义事件
- #endregion
- //这里是一个定义好的事件
- public event Action<int> thisevent;
-
- //这里是一个自定义的触发函数
- public void Tigger(int a) {
-
- if (thisevent != null) {
- //已被订阅就触发事件
- thisevent(a);
- }
- else {
- //抛出异常
- throw new Exception("未订阅事件,你用个der!");
- }
- }
- //这里订阅一个监听函数
- public void Monitor(int monitor)
- {
- if(monitor>=5)
- {
- Tigger(monitor);
- }
- else
- {
- Console.WriteLine("条件不满足");
- }
-
- }
-
- }
- class Subscriber
- {
- //这个就叫事件处理器,感觉完全没必要,就叫响应函数也行啊
- public void AnyFunction(int t)
- {
- Console.WriteLine("事件已触发,订阅者响应,验证码:"+t);
- }
- }
评论记录:
回复评论: