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