C# 的 事件 与 EventHandler

事件接受与发送是通过 委托来实现的,随意,在学习事件之前一定要知道委托。

首先我们先看下图:请添加图片描述上的图不完整人,但大概是这个意思。

我们要创建一个事件管理。 来处理发布者发送消息和订阅者的接受消息中间转接。
然后订阅者去创建监听消息,然后,发布者再去触发事件。事件管理就会向所有监听该事件的订阅者去发布消息。当订阅者监听到消息后,会对其做一些相关的操作。大概就是这么个意思。

然后,我们开始写代码吧。首先,我们要去创建事件管理,其实就是一个委托,但创建的时候需要添加 关键字 event。

public delegate void EventManager();
class EventClass
{private static EventClass _instance;public static EventClass Instance{get{if (_instance == null)_instance = new EventClass();return _instance;}}// 创建一个事件管理对象private event EventManager eventManager;public void AddEventListener(EventManager arge){eventManager += arge;}public void RemoveEventListener(EventManager arge){eventManager -= arge;}public void DispatchEvent(){eventManager();}
}

我们创建了一个委托类型 EventManager 然后在 EventClass 类中创建了 添加 事件的方法 AddEventListener 移除监听事件 RemoveEventListener 和 分发事件 DispatchEvent
。当订阅者监听是后,就会去调用 AddEventListener 函数如下:

class EventClass1 
{public void PrintLog(){Console.WriteLine("EventClass1__PrintLog");}
}EventClass1 event1 = new EventClass1();
EventClass.Instance.AddEventListener(event1.PrintLog);

这个时候,委托变量 eventManager 就会记录 event1 对象中的 PrintLog 函数正在监听着事件。当其他函数去执行 DispatchEvent 分发事件函数时,eventManager 会调用每一个监听事件函数。完整代码如下:

public delegate void EventManager();class EventClass{private static EventClass _instance;public static EventClass Instance{get{if (_instance == null)  _instance = new EventClass();return _instance;}}// 创建一个事件管理对象private event EventManager eventManager;public void AddEventListener(EventManager arge){eventManager += arge;}public void RemoveEventListener(EventManager arge){eventManager -= arge;}public void DispatchEvent(){eventManager();}}class EventClass1 {public void PrintLog(){Console.WriteLine("EventClass1__PrintLog");}}class EventClass2{public void PrintLog2(){Console.WriteLine("EventClass2_PrintLog2");}}class Program{static void Main(string[] args){EventClass1 event1 = new EventClass1();EventClass2 event2 = new EventClass2();EventClass.Instance.AddEventListener(event1.PrintLog);EventClass.Instance.AddEventListener(event2.PrintLog2);// 调用分发事件函数EventClass.Instance.DispatchEvent();Console.ReadKey();}}

运行结果如下:
EventClass1__PrintLog
EventClass2_PrintLog2

在这里创建事件委托的还可以使用 event 关键字简化

 public event EventManager eventManager;// 创建一个事件管理对象//private EventManager eventManager;//public void AddEventListener(EventManager arge)//{//    eventManager += arge;//}//public void RemoveEventListener(EventManager arge)//{//    eventManager -= arge;//}

这样的话,就可以直接 使用 “+=” 方式来进行监听事件

EventClass.Instance.eventManager += event1.PrintLog;
EventClass.Instance.eventManager += event2.PrintLog2;

看完整的代码

public delegate void EventManager();
class EventClass
{private static EventClass _instance;public static EventClass Instance{get{if (_instance == null)  _instance = new EventClass();return _instance;}}public event EventManager eventManager;public void DispatchEvent(){eventManager();}
}class EventClass1 
{public void PrintLog(){Console.WriteLine("EventClass1__PrintLog");}
}class EventClass2
{public void PrintLog2(){Console.WriteLine("EventClass2_PrintLog2");}
}class Program
{static void Main(string[] args){EventClass1 event1 = new EventClass1();EventClass2 event2 = new EventClass2();EventClass.Instance.eventManager += event1.PrintLog;EventClass.Instance.eventManager += event2.PrintLog2;// 调用分发事件函数EventClass.Instance.DispatchEvent();Console.ReadKey();}
}

其实系统有给我们创建通用的事件委托 EventHandler,这样的话,我们就不需要自己定义委托了。直接可以使用通用委托来定义。在我们传递监听参数时就需要传递参数,带上两个参数。object 和 EventArgs 而输出的时候,也需要带上参数第一个就是委托所在类本身,第二个没有参数,可以传 null

public event EventHandler eventManager;
 //public void PrintLog()//{//    Console.WriteLine("EventClass1__PrintLog");//}public void PrintLog(object source, EventArgs e){Console.WriteLine("EventClass1__PrintLog");}

```csharp
public void DispatchEvent()
{if (eventManager != null)eventManager(this, null);}

其他的基本上不用变化。输出还是一样的。

在使用通用委托时,有两个参数,其中 EventArgs 是可以传递参数的,但是要传递参数的话,必须继承 EventArgs 类来储存内容才能使用。而我们的委托也要用泛型委托。具体看下面代码:

public class EventArgsTest : EventArgs
{public int TestNum { get; set; }}class EventClass{private static EventClass _instance;public static EventClass Instance{get{if (_instance == null)_instance = new EventClass();return _instance;}}public event EventHandler<EventArgsTest> eventManager;public void DispatchEvent(){EventArgsTest e = new EventArgsTest();e.TestNum = 10;if (eventManager != null)eventManager(this, e);}}class EventClass1{public void PrintLog(object source, EventArgsTest e){Console.WriteLine("EventClass1__PrintLog = {0}", e.TestNum);}}class EventClass2{public void PrintLog2(object source, EventArgsTest e){Console.WriteLine("EventClass2_PrintLog2 = {0}", e.TestNum);}}class Program{static void Main(string[] args){EventClass1 event1 = new EventClass1();EventClass2 event2 = new EventClass2();EventClass.Instance.eventManager += event1.PrintLog;EventClass.Instance.eventManager += event2.PrintLog2;// 调用分发事件函数EventClass.Instance.DispatchEvent();Console.ReadKey();}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/352926.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

C# 实例解析事件委托之EventHandler

概述 事件属于委托的一个子集&#xff0c;像我们平时界面上的鼠标点击按钮后响应事件、事件的发布和订阅等都需要用到委托.通过委托可以很好的实现类之间的解耦好。事件委托EventHandler的 函数原型如下&#xff1a;delegate 表示这个个委托&#xff0c;事件委托没有返回值&…

wpf中EventHandler的使用

应用情景&#xff1a;比如点击A界面的a按钮&#xff0c;跳转到B界面了&#xff0c;点击b按钮后&#xff0c;触发了业务逻辑&#xff0c;然后需要回到A界面中执行某一个方法。不是唯一的方法&#xff0c;可以使用别的方法&#xff0c;类似观察者模式&#xff0c;有变化了&#x…

使用Transformer模型进行计算机视觉任务的端对端对象检测

Transformer模型是google团队在2017在论文attention is all you need中提出的一个用于NLP领域的模型,但是随着VIT模型与Swin Transformer模型的发布,把Transformer模型成功应用到计算机视觉任务中。 上期图文,我们使用hugging face的transformers模型进行了VIT模型的对象分…

3、线程通信EventHandler使用

作者&#xff1a;韩茹 公司&#xff1a;程序咖&#xff08;北京&#xff09;科技有限公司 鸿蒙巴士专栏作家 一、使用场景 EventHandler开发场景 EventHandler的主要功能是将InnerEvent事件或者Runnable任务投递到其他的线程进行处理&#xff0c;其使用的场景包括&#xff1a…

ChatGPT市场营销指南震撼出炉,你错过了?!

ChatGPT是一种基于AI技术的语言模型&#xff0c;它可以与用户进行对话和交互。它被广泛应用于各个领域&#xff0c;包括市场营销。作为一名市场营销人员&#xff0c;您可以使用ChatGPT来获得创意、解决问题和生成内容。 下面是190个ChatGPT提示&#xff0c;可帮助营销人员更好…

专业分析┃微电子专业介绍及发展前瞻

不知道提到微电子&#xff0c;你最先想到的是什么&#xff1f;芯片&#xff1f;卡脖子&#xff1f;摩尔定律&#xff1f; 因为近两年芯片被限制的原因&#xff0c;大家经常可以从各路媒体上看到“芯片”一词。微电子作为一个学科&#xff0c;简单的说&#xff0c;就是研究如何…

Cookie和session工作流程详解

目录 cookie机制 session会话 理解会话机制 Servlet中对Cookie和Session提供的 HttpServletrequest类中的方法&#xff1a; 模拟实现登录功能 首先实现功能分为两个界面&#xff1a; &#xff08;1&#xff09;登录页面代码&#xff08;前端代码&#xff09; (2) 编写Lo…

Mac - 鼠标拖尾特效 By CursorEffect2

目录 一.引言 二.安装 CursorEffect2 三.使用 CursorEffect2 四.使用效果 五.内存消耗 六.一键关闭 七.总结 一.引言 在自己搭建的 Hexo 博客上可以定义鼠标点击的特效&#xff0c;如图点击后可以产生彩色的斑点。 于是想着除了浏览 Hexo 博客外&#xff0c;能不能别的也…

MyBatis深入学习总结

MyBatis总结 MyBatis入门操作 简介 原始jdbc操作&#xff08;查询数据&#xff09; 原始jdbc操作&#xff08;插入数据&#xff09; 原始jdbc操作的分析 原始jdbbc开发存在的问题如下&#xff1a; 数据库连接创建、释放频繁造成系统资源的浪费从而影响系统性能sql语句在代…

window11中QQ登录“无法访问个人文件夹”解决方案

window11刚发行不久&#xff0c;安装各种软件或多或少会遇到各种bug&#xff0c;例如安装QQ后&#xff0c;打开时会提醒你“无法访问个人文件夹”而打开QQ失败。 可以通过改变你自己设置的个人文件夹的权限来解决这个问题。 找到文件夹所在位置&#xff0c;右击文件夹&#xf…

QQ登录显示无法访问个人文件夹解决办法

之前QQ登录出错&#xff0c;一直显示无法访问个人文件夹&#xff0c;是否自动修复个人文件权限 直接找到你安装qq的文件路径&#xff0c;右键--》授予访问权限--》删除访问&#xff0c;就可以正常登录了 &#xff01;

如何解决Windows10启动QQ时报错无法访问个人文件夹?

1、首先不要安装其他电脑管家&#xff0c;因为这会使Windows10自带的安全中心出现变化&#xff0c;第一步打开自带安全中心。 2、进入之后找到病毒和威胁防护&#xff0c;进入病毒和威胁防护设置。 3、进入病毒和威胁防护设置后&#xff0c;找到管理受控制文件夹访问权限。 4、…

启动QQ时无法访问个人文件夹XXX,是否自动修复个人文件夹权限

如图 点击确定显示修复权限失败 找到上图显示的文件路径 右键属性 -> 安全 -> 编辑 -> 选中Users -> 勾选完全控制

腾讯QQ登录“无法访问个人文件夹”解决方法

今天&#xff0c;登录QQ时出现“无法访问个人文件夹&#xff0c;个人文件将被保存到我的文档”的问题 上网搜索了一下&#xff0c;还是没有解决问题。然后自己思考了一下&#xff0c;可能与我修改了“我的文档”的路径有关&#xff0c;我刚刚安装的QQ个人文件夹也正好指定放在…

解决QQ显示“无法访问个人文件夹”方法

在qq登录的过程中&#xff0c;显示“无法访问个人文件夹”这样的提示&#xff0c;该怎解决&#xff1f; 尝试过把qq卸载之后重新装&#xff0c;改变一下qq的属性-兼容性&#xff0c;以及管理员的方式运行&#xff0c;查了不少的攻略&#xff0c;始终无法解决&#xff1b; 经过…

Win11 “qq无法访问个人文件夹”解决方法(原创)

今天登QQ&#xff0c;突然弹窗显示“qq无法访问个人文件夹”&#xff0c;网上搜了一堆方法都没用&#xff0c;也不想卸载重装qq&#xff0c;我就寻思是不是文件夹权限的问题。 右键显示的无法访问的个人文件夹&#xff0c;选择“安全”&#xff0c;我把Users的权限选中&#xf…

qq 微信 无法访问个人文件夹

昨天某个时刻开始&#xff0c;QQ会出现所有图片无法加载的状况&#xff0c;微信会出现截图发到聊天框是文件的问题。 一开始不以为然&#xff0c;直到第二天重启电脑发现两个软件都登陆不上去了。对应显示的是标题的关键字&#xff0c;因为问题已经解决就不截图了。 解决方案&…

android 新建桌面文件夹在哪里,添加并管理桌面文件夹

添加并管理桌面文件夹 我们在使用Android手机的时候&#xff0c;随着手机内安装的软件越来越多&#xff0c;比如说笔者的这个手机里&#xff0c;算了一下&#xff0c;一共装了110个应用程序&#xff0c;七个分页&#xff0c;每页显示16个图标。那么在这里我们设想一下&#xff…

Win11QQ无法访问个人文件夹

Win11QQ无法访问个人文件夹 #第一步 找到QQ文件存储的文件夹 #第二步 右键→属性→安全→User→编辑→User→完全控制→确定 #OK了 去试一试吧b(&#xffe3;▽&#xffe3;)d

C盘瘦身:QQ文件的清理及Group2文件夹

目录 问题解决方法 Windows 10 20H2 TIM 问题 最近C盘被撑爆了 使用SpaceSniffer一扫发现QQ的文件中有个Group2文件夹占了我17G 但使用QQ自带的个人文件夹清理却扫不到&#xff0c;据说直接删除会丢失近期所有群聊的聊天图片 解决方法 在这个地方找到了大神fsz1987给出的…