在C#中实现事件的订阅和解除订阅

在C#中,事件的订阅和解除订阅是通过使用+=-=操作符来实现的,这些操作符分别用于将事件处理程序添加到事件和从事件中移除事件处理程序。以下是如何实现这些操作的详细步骤:

定义事件和委托

首先,您需要定义一个委托,它指定了事件处理程序的签名。然后,在发布事件的类中使用这个委托类型来声明事件。

using System;public delegate void MyEventHandler(object sender, MyEventArgs e); // 定义委托public class MyEventArgs : EventArgs // 自定义事件参数类,继承自EventArgs
{public string Message { get; }public MyEventArgs(string message){Message = message;}
}public class MyEventClass
{// 声明事件,使用前面定义的委托类型public event MyEventHandler MyEvent;// 触发事件的方法protected virtual void OnMyEvent(MyEventArgs e){MyEvent?.Invoke(this, e); // 使用?.操作符来避免空引用异常}// 一个可能触发事件的方法public void DoSomething(){// ... 执行一些操作OnMyEvent(new MyEventArgs("Something happened!"));}
}

订阅事件

要订阅事件,您需要创建一个符合委托签名的方法,并将其添加到事件上。

public class EventSubscriber
{// 事件处理方法public void HandleMyEvent(object sender, MyEventArgs e){Console.WriteLine($"Received event with message: {e.Message}");}
}class Program
{static void Main(string[] args){MyEventClass myEventClass = new MyEventClass();EventSubscriber subscriber = new EventSubscriber();// 订阅事件myEventClass.MyEvent += subscriber.HandleMyEvent;// 触发事件myEventClass.DoSomething();// ... 其他操作}
}

解除订阅事件

要解除订阅事件,您需要使用-=操作符将事件处理方法从事件上移除。

class Program
{static void Main(string[] args){MyEventClass myEventClass = new MyEventClass();EventSubscriber subscriber = new EventSubscriber();// 订阅事件myEventClass.MyEvent += subscriber.HandleMyEvent;// 触发事件myEventClass.DoSomething(); // 输出:Received event with message: Something happened!// 解除订阅事件myEventClass.MyEvent -= subscriber.HandleMyEvent;// 再次触发事件,这次不会有任何输出,因为已经解除了订阅myEventClass.DoSomething();// ... 其他操作// 确保在不再需要订阅者时释放资源(例如,如果它是IDisposable的)// subscriber.Dispose(); // 假设EventSubscriber实现了IDisposable}
}

注意事项

  • 内存管理:确保在不再需要事件订阅者时解除订阅,以避免内存泄漏。特别是当事件发布者和订阅者有不同的生命周期时。
  • 线程安全:在多线程环境中,添加和移除事件处理程序时需要考虑线程安全性。可以使用锁或其他同步机制来确保线程安全。
  • 弱引用:如果事件订阅者是不希望被垃圾回收器回收的长期存在的对象(例如,静态对象或长时间运行的服务),则可以考虑使用弱引用来避免内存泄漏。但是,请注意,弱引用会增加代码的复杂性,并且在使用时需要小心。

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

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

相关文章

如何用WPS AI提高工作效率

对于每位职场人而言,与Word、Excel和PPT打交道几乎成为日常工作中不可或缺的一部分。在办公软件的选择上,国外以Office为代表,而在国内,WPS则是不可忽视的一大选择。当年一代天才程序员求伯君创造了WPS,后面雷军把它装…

深度学习中的并行策略概述:1 单GPU优化

深度学习中的并行策略概述:1 单GPU优化 1 Training Larger Models on a Single GPU 在讨论模型的“扩展”时,往往会想到在多个GPU或多台机器上进行模型训练。不过,即便是在单个GPU上,也存在多种方法来训练更大规模的模型并提升…

Go+chromedp实现Web UI自动化测试

1.为什么使用go进行UI自动化测试? 速度:Go速度很快,这在运行包含数百个UI测试的测试套件时是一个巨大的优势 并发性:可以利用Go的内置并发性(goroutines)来并行化测试执行 简单:Go的简约语法允许您编写可读且可维护…

2、C#基于.net framework的应用开发实战编程 - 设计(二、三) - 编程手把手系列文章...

二、设计; 二.三、构建数据库; 此例子使用的是SQLite数据库,所以数据库工具用的SQLiteStudio x64,这个是SQLite专用的数据库设计管理工具,其它的数据库管理工具比如DBeaver的使用请见实战工具系列文章。 1、…

2011-2020年各省城镇职工基本医疗保险年末参保人数数据

2011-2020年各省城镇职工基本医疗保险年末参保人数数据 1、时间:2011-2020年 2、来源:国家统计局 3、指标:省份、时间、城镇职工基本医疗保险年末参保人数 4、范围:31省 5、指标解释:参保人数指报告期末按国家有关…

Github优质项目推荐(第九期)

文章目录 Github优质项目推荐(第九期)一、【tldraw】,37.1k stars - 在 React 中创建无限画布体验的库二、【zapret】,9.1k stars - 独立(无需第三方服务器)DPI 规避工具三、【uBlock】,48.3k s…

Web安全攻防入门教程——hvv行动详解

Web安全攻防入门教程 Web安全攻防是指在Web应用程序的开发、部署和运行过程中,保护Web应用免受攻击和恶意行为的技术与策略。这个领域不仅涉及防御措施的实现,还包括通过渗透测试、漏洞挖掘和模拟攻击来识别潜在的安全问题。 本教程将带你入门Web安全攻防…

KOI技术-事件驱动编程(前端)

1 “你日渐平庸,甘于平庸,将继续平庸。”——《以自己喜欢的方式过一生》 2. “总是有人要赢的,那为什么不能是我呢?”——科比布莱恩特 3. “你那么憎恨那些人,和他们斗了那么久,最终却要变得和他们一样,…

嵌入式Linux QT+OpenCV基于人脸识别的考勤系统 项目

此项目是基于人脸识别的考勤系统开发,包括如下模块: 1、人脸识别考勤系统GUI界面设计,包括: (1)Qt环境(window环境/linux环境) ; (2)Qt工程创建分析; &am…

UGUI简单动画制作

一、最终效果 UI简单动画制作 二、制作过程 1、打开动画制作窗口 2、新建一个动画 3、给一个对象制作动画 4、创建动画控制器进行不同动画变换控制 5、书写脚本,通过按钮来进行不同动画切换 using System.Collections; using System.Collections.Generic; using U…

Windows Powershell实战指南(未完成)

目前只作简单了解,开始吧。 一、初识Powershell 目标 初步认识 Powershell和其集成环境 Ise,学会基本设置 实验 我们从简单的例子开始:希望你能从控制台和ISE的配置中实现相同的结果。然后按照下面五步进行。 (1)选…

PyQt实战——实现可视化音频播放器(十三)

系类往期文章: PyQt5实战——多脚本集合包,前言与环境配置(一) PyQt5实战——多脚本集合包,UI以及工程布局(二) PyQt5实战——多脚本集合包,程序入口QMainWindow(三&…

Java日志框架:log4j、log4j2、logback

文章目录 配置文件相关1. properties测试 2. XMl使用Dom4j解析XML Log4j与Log4j2日志门面 一、Log4j1.1 Logges1.2 Appenders1.3 Layouts1.4 使用1.5 配置文件详解1.5.1 配置根目录1.5.2 配置日志信息输出目的地Appender1.5.3 输出格式设置 二、Log4j22.1 XML配置文件解析2.2 使…

RustDesk内置ID服务器,Key教程

RustDesk内置ID服务器,Key教程 首先需要准备一个域名,并将其指定到你的 rustdesk 服务器 ip 地址上,这里编译采用的是Github Actions ,说白了是就workflows,可以创建一些自动化的工作流程,例如代码的检查&a…

OpenHarmony怎么修改DPI密度值?RK3566鸿蒙开发板演示

本文介绍在开源鸿蒙OpenHarmony系统下,修改DPI密度值的方法,触觉智能Purple Pi OH鸿蒙开发板演示,搭载了瑞芯微RK3566四核处理器,Laval鸿蒙社区推荐开发板,已适配全新开源鸿蒙OpenHarmony5.0 Release系统,适…

OCR实践-Table-Transformer

前言 书接上文 OCR实践—PaddleOCR Table-Transformer 与 PubTables-1M table-transformer,来自微软,基于Detr,在PubTables1M 数据集上进行训练,模型是在提出数据集同时的工作, paper PubTables-1M: Towards comp…

常见的邮件协议SMTP和POP3

常见的邮件协议包括SMTP和POP3,SMTP用来发送邮件,POP3用来接收邮件信息。 SMTP SMTP 是一种用于发送电子邮件的协议。它的主要作用是将**电子邮件**从邮件客户端(如 Outlook、Thunderbird)或邮件服务器发送到接收服务器。 SMTP …

UGUI源码分析 --- UI的更新入口

首先所有的UI组件都是添加到画布(Canvas)显示的,所以首先要从Canvas入手,通过搜索脚本函数以及使用Profiler查看UI的函数的执行,定位到了willRenderCanvases函数 打开UI的文件夹, 通过搜索willRenderCanvas…

Wend看源码-Java-集合学习(Set)

概述 Wend看源码-Java-集合学习(List)-CSDN博客 在上一篇文章中,我们深入探讨了Java集合框架的父类以及List集合的细节。接下来,本文将重点阐述Java中的Set集合,包括其内部的数据结构以及核心方法的详尽说明。 Set 集合 图1 java-Set类型数据…

双闭环直流调速系统

一 设计要求 1、原始条件 主要参数:直流电机PN 22KW,额定电压UN220V, 额定电流IN106A,nN 1500r/min,电枢绕组电阻Ra 0.11Ω,主电路总电阻R0.32Ω,磁极对数P2, Ks22,GD2…