学懂C#编程:常用高级技术——委托(Delegate)应用场景——事件处理

事件处理: 委托是C#事件模型的核心。一个事件本质上是一个委托类型的字段,用于存储一系列方法的引用,当特定事件发生时,这些方法会被调用。

        我们通过下面这个例子来讲解C#中事件(Event)的基本用法,通过Publisher类发布事件,Subscriber类订阅并处理这个事件。下面我用更直白的语言解释这个过程:

Publisher 类

        想象一下,Publisher(发布者)就像是一个广播站,它可以发出某种信号或者说“事件”。在这个例子中,它有一个名为EventHappened的事件,这个事件的类型是EventHandler<EventArgs>。你可以认为EventHandler<EventArgs>是一种特殊的委托类型,它连接了事件触发的地方和事件响应的地方。当事件触发时,所有订阅了这个事件的人都会得到通知。

public class Publisher
{// 声明一个事件,类型是 EventHandler,它是一个委托类型,用于接收发送者对象和事件参数public event EventHandler<EventArgs> EventHappened;// 这个方法用于触发事件,即告诉所有订阅者:“事件发生了!”public void RaiseEvent(){// 使用?.运算符来安全地调用事件,如果没有人订阅,也不会抛出异常EventHappened?.Invoke(this, EventArgs.Empty); // this 表示事件发生的源头,EventArgs.Empty 是默认的事件参数,通常用于表示事件发生,但没有携带额外信息}
}

Subscriber 类

Subscriber(订阅者)就像是收音机,它对特定的广播(事件)感兴趣。在构造函数中,Subscriber订阅了来自PublisherEventHappened事件,并指定了当这个事件发生时应该执行的方法OnEvent

public class Subscriber
{// 构造函数中,订阅Publisher的EventHappened事件public Subscriber(Publisher pub){// += 操作符用于订阅事件,OnEvent 是事件触发时执行的方法pub.EventHappened += OnEvent;}// 这是事件处理方法,当EventHappened事件被Publisher触发时,这个方法就会被执行private void OnEvent(object sender, EventArgs e){// 打印一条消息,表明事件已被处理Console.WriteLine("Event handled.");}
}

整体流程

  1. 创建一个Publisher实例,它是事件的源头。
  2. 创建一个或多个Subscriber实例,并将它们与Publisher关联起来。这个关联过程就是订阅事件,通过在Subscriber的构造函数中向Publisher的事件添加事件处理程序(OnEvent方法)来实现。
  3. Publisher通过调用RaiseEvent方法“广播”事件时,所有订阅了这个事件的Subscriber实例都会接收到通知,并执行它们各自定义的OnEvent方法,完成事件的处理。

        简而言之,事件机制让对象能够通知其他对象“某件事发生了”,而不用直接调用那些对象的方法,增强了代码的解耦和灵活性。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

神经网络学习-池化层

池化层方法 池化一般是用来对卷积层进行降维 空洞卷积&#xff0c;通过在卷积核的元素之间插入“空洞”&#xff08;即零&#xff09;&#xff0c;可以在不增加参数量和计算量的情况下扩大卷积核的感受野。这对于捕捉图像中的多尺度信息特别有用。 池化的默认步长是池化核的大…

drogon跨域问题和全局异常处理

2024年6月20日12:21:11 在main.cc里加入 /*** 全局异常处理*/drogon::app().setExceptionHandler([](const std::exception &e,const drogon::HttpRequestPtr &req,std::function<void(drogon::HttpResponsePtr &)> &&callback){LOG_DEBUG <<…

vscode插件开发之 - 消息通信

在开发vscode插件过程中&#xff0c;有一个典型场景是webview与extension.ts进行通信&#xff0c;例如&#xff0c;webview上的某些信息发送改变时&#xff0c;需要发送消息传递给extension.ts. 如果使用react框架构建vscode插件的webview&#xff0c;如何实现webview与extensi…

Python爬虫工程师的技术栈

第一部分&#xff1a;Python爬虫工程师的技术栈 引言 Python爬虫工程师负责设计和实现自动化数据采集系统&#xff0c;从互联网上抓取所需的数据。在本文的第一部分&#xff0c;我们将详细介绍Python爬虫工程师的技术栈&#xff0c;包括爬虫框架、数据存储、并发处理、异常处…

工厂ESOP系统促进工厂快速响应和工艺改进

在当今追求可持续发展和创新的时代&#xff0c;新能源产业正以惊人的速度崛起。新能源工厂作为这一领域的核心生产环节&#xff0c;面临着不断提高效率、优化工艺和快速应用新技术的巨大挑战。为了应对这些挑战&#xff0c;越来越多的新能源工厂开始引入 ESOP 系统&#xff08;…

为什么企业需要数据挖掘平台?哪个比较好呢?

什么是数据挖掘&#xff1f; 数据挖掘就是从大量的数据中去发现有用的信息&#xff0c;然后根据这些信息来辅助决策。听起来是不是跟传统的数据分析很像呢&#xff1f;实际上&#xff0c;数据挖掘就是智能化的数据分析&#xff0c;它们的目标都是一样的。但是&#xff0c…

通用大模型

方向一&#xff1a;背景介绍 通用大模型&#xff08;如 GPT-3.5 和 GPT-4&#xff09;和垂直大模型各有优点和适用场景&#xff0c;选择更青睐哪一方主要取决于具体需求和应用场景。以下是两者的对比&#xff1a; 通用大模型 优点: 广泛适用性: 通用大模型可以用于多种任务&…

【SPIE独立出版 | 往届均已完成EI检索】2024云计算、性能计算与深度学习国际学术会议(CCPCDL 2024)

2024云计算、性能计算与深度学习国际学术会议(CCPCDL 2024) 2024 International conference on Cloud Computing, Performance Computing and Deep Learning *CCPCDL往届均已完成EI检索&#xff0c;最快会后4个半月完成&#xff01; 一、重要信息 大会官网&#xff1a;www…

盘点海外大带宽服务器:哪家值得选?

针对外贸业务遭遇大流量访问时的巨大带宽需求&#xff0c;我们可能有很多人会选择寻找一些海外大带宽服务器提供商来提升网站的访问效率。所以&#xff0c;本文整理了五个海外大带宽服务器的产品商家&#xff0c;如果有需要可以选择参考。 亚马逊 AWS(Amazon Web Services) 亚马…

《深入理解Spark RDD缓存机制》(第4天)

文章目录 前言一、小试牛刀&#xff1a;解剖RDD缓存机制&#xff1f;1. 什么是Spark RDD缓存策略1.1 为什幺RDD要做缓存1.2 缓存相关API&#xff1a;1.3 缓存案例解析:1.4 图解缓存效果: 2. 什么是checkpoint缓存2.1 为什么要做checkpoint缓存2.2 checkpoint相关API:2.3 checkp…

七彩影视双端新版本源码 支持PC+WAP+APP三端 对接苹果CMS后台

下载地址&#xff1a;七彩影视双端新版本源码 支持PCWAPAPP三端 对接苹果CMS后台 适合做影视类&#xff0c;高端大气

强化学习——基本概念

何为强化学习 机器学习的一大分支 强化学习&#xff08;Reinforcement Learning&#xff09;是机器学习的一种&#xff0c;它通过与环境不断地交互&#xff0c;借助环境的反馈来调整自己的行为&#xff0c;使得累计回报最大。强化学习要解决的是决策问题——求取当前状态下最…

群晖NAS本地部署并运行一个基于大语言模型Llama2的个人本地聊天机器人

前言 本文主要分享如何在群晖 NAS 本地部署并运行一个基于大语言模型 Llama 2 的个人本地聊天机器人并结合内网穿透工具发布到公网远程访问。本地部署对设备配置要求高一些,如果想要拥有比较好的体验,可以使用高配置的服务器设备. 目前大部分大语言模型的产品都是基于网络线上…

MyBatisPlus:MyBatisPlus入门

MyBatisPlus Mybatis-Plus是一个MyBatis的增强工具,在mybatis的基础上只做增强不做改变 简化开发,提高效率 MP的特性 无侵入 只做增强不做改变 损耗小 启动时自动注入基本CRUD,性能几乎无循环 强大的CRUD操作 内置通用Mapper和Service实现大部分单表操作 支持Lambda形…

【ai】tx2-nx:安装深度学习环境及4.6对应pytorch

参考:https://www.waveshare.net/wiki/Jetson_TX2_NX#AI.E5.85.A5.E9.97.A8 英伟达2021年发布的的tritionserver 2.17 版本中,backend 有tensorflow1 和 onnxruntime ,他们都是做什么用的,作为backend 对于 triton 推理server意义是什么,是否应该有pytorch? Triton Infer…

PS给logo加白色描边

步骤1&#xff1a;打开你的Logo文件 步骤2&#xff1a;选择Logo层 在“图层”面板中找到你的Logo所在的图层。如果你的Logo是在背景图层上&#xff0c;可以将它转换为普通图层&#xff08;右键点击背景图层&#xff0c;选择“从背景图层转换”&#xff09;&#xff08;此处也…

五大数据防泄漏系统排名|高效实用的防泄漏软件有哪些

在数字化时代&#xff0c;数据泄露已成为企业面临的重要安全挑战之一。为了有效应对这一挑战&#xff0c;企业需要借助先进的数据泄露防护系统来保护其敏感信息免受非法访问、使用和泄露。以下是五大备受推崇的数据泄露防护系统&#xff0c;它们各具特色&#xff0c;功能强大&a…

查看nginx安装/配置路径,一个服务器启动两个nginx

查看nginx安装/配置路径 查看nginx的pid&#xff1a; ps -ef | grep nginx查看pid对应服务的启动路径 ll /proc/2320/exe使用检查配置文件命令&#xff0c;查看配置文件位置 /usr/local/nginx/sbin/nginx -t一个服务启动两个nginx 拷贝一份程序&#xff0c;cpbin是我自己创…

阿里云服务器提醒漏洞要不要打补丁?

我们自己用的电脑一旦发现漏洞&#xff0c;往往是第一时间进行打补丁重启等等&#xff0c;但是作为服务器而言&#xff0c;往往没有这个习惯&#xff0c;为什么&#xff1f;因为害怕服务器打补丁以后&#xff0c;重启后出现打不开的情况&#xff0c;毕竟稳定的运行似乎在这种情…

java.io.eofexception:ssl peer shut down incorrectly

可能是因为 1)https设置 2&#xff09;超时设置 FeignConfig.java package zwf.service;import java.io.IOException; import java.io.InputStream; import java.security.KeyStore;import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory;import org.apac…