c#中的事件

在C#中,事件(Events)是一种使类或对象能够提供通知的机制。当某个重要事情发生时(比如用户点击了一个按钮、数据发生变化等),事件的发布者(通常是一个类)会通知事件的所有订阅者(也称为事件处理器或事件监听器)。这样,订阅者就可以对这些事件做出响应。

事件的组成部分

  1. 事件发布者(Event Publisher):这是定义并触发事件的类或对象。
  2. 事件(Event):这是一个特殊的成员,它封装了事件发布者和订阅者之间的通信。
  3. 事件处理器(Event Handler):这是当事件发生时被调用的方法。事件处理器需要符合特定的签名,这个签名由事件定义时指定。
  4. 事件订阅者(Event Subscriber):这是订阅(或监听)事件的对象。订阅者通过为事件提供事件处理器来订阅事件。

如何定义和使用事件

定义事件

在C#中,事件通常是通过event关键字声明的,并且其类型是一个委托(Delegate)。委托定义了事件处理器的签名。

public class MyEventPublisher
{// 声明事件处理器委托public delegate void MyEventHandler(object sender, EventArgs e);// 声明事件public event MyEventHandler MyEvent;// 触发事件的方法protected virtual void OnMyEvent(EventArgs e){MyEventHandler handler = MyEvent;if (handler != null){handler(this, e);}}// 在某处调用OnMyEvent来触发事件public void DoSomething(){// ... 做一些工作OnMyEvent(EventArgs.Empty);}
}
订阅事件

任何对象都可以订阅MyEventPublisher类的事件,只要它实现了MyEventHandler委托定义的方法签名。

class Program
{static void Main(string[] args){MyEventPublisher publisher = new MyEventPublisher();// 订阅事件publisher.MyEvent += new MyEventPublisher.MyEventHandler(MyEventHandlerMethod);// 触发事件publisher.DoSomething();}static void MyEventHandlerMethod(object sender, EventArgs e){Console.WriteLine("事件被触发!");}
}
取消订阅事件

取消订阅事件也非常简单,只需使用-=操作符即可。

publisher.MyEvent -= MyEventHandlerMethod;

使用.NET内置的事件模式

在.NET中,许多类都遵循了一个标准的事件模式,其中EventHandlerEventArgs是常用的委托和类。使用这些内置的类和委托可以让你的代码更加标准化和易于理解。

public event EventHandler MyEvent;// 触发事件
protected virtual void OnMyEvent(EventArgs e)
{EventHandler handler = MyEvent;handler?.Invoke(this, e);
}

这种方式利用了C# 6.0引入的空合并运算符?.来简化空检查。如果MyEvent不为null,则调用Invoke方法;否则,什么也不做。

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

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

相关文章

在Centos上安装MySQL

目录 在Centos上安装MySQL1.确认当前的系统版本2.添加 MySQL Yum 源2.1访问MySQL开发者专区2.2根据当前系统选择对应的发布包2.3补充 3.MySQL的历史发行版本4.安装发布包5.安装MySQL5.1启动MySQL服务器5.2查看服务器状态5.3开机自启动5.4 登入MySQL5.5修改密码 在Centos上安装M…

Spring Data Redis + Redis数据缓存学习笔记

文章目录 1 Redis 入门1.1 简介1.2 Redis服务启动与停止(Windows)1.2.1 服务启动命令1.2.2 客户端连接命令1.2.3 修改Redis配置文件1.2.4 Redis客户端图形工具 2. Redis数据类型2.1 五种常用数据类型介绍 3. Redis常用命令3.1 字符串操作命令3.2 哈希操作…

Docker-Nvidia(NVIDIA Container Toolkit)

安装NVIDIA Container Toolkit工具,支持docker使用GPU 目录 1.NVIDIA Container Toolkit 安装1.1 nvidia-docker安装1.2 验证1.2.1 验证安装1.2.2 额外补充 1.NVIDIA Container Toolkit 安装 1.1 nvidia-docker安装 NVIDIA/nvidia-docker Installing the NVIDIA …

MySQL 关键字 IN 与 EXISTS 的使用与区别

目录 1. IN & NOT IN1.1 基本使用1.2 工作原理1.2.1 静态值列表的 IN 语句1.2.2 子查询的 IN 语句 1.3 相关优化 2. EXISTS & NOT EXISTS2.1 基本使用2.2 工作原理2.3 相关优化 3. 两者区别 1. IN & NOT IN IN:IN用于判断某个字段的值是否存在于给定的…

SQL Server Query Store Settings (查询存储设置)

参考:Query Store Settings - Erin Stellato 在 SQL Server 2017 中,有九 (9) 个设置与查询存储相关。虽然这些设置记录在sys.database_query_store_options中,但我经常被问到每个设置的值“应该”是多少。我在下面列出了每个设置&am…

AI数字人直播源码解析:灰豚私有化部署背后的技术分析

随着AI数字人技术的应用潜力不断显现,与AI数字人相关的多个项目逐渐成为创业者们的重点关注对象,作为当前AI数字人典型应用场景之一的数字人直播意向人数更是屡创新高,AI数字人直播源码部署的热度也因此不断飙升,与各大数字人源码…

Centos7 安装私有 Gitlab

在 CentOS 7上,下面的命令也会在系统防火墙中打开 HTTP、HTTPS 和 SSH 访问。这是一个可选步骤,如果您打算仅从本地网络访问极狐GitLab,则可以跳过它。 sudo yum install -y curl policycoreutils-python openssh-server perl sudo systemct…

昇思25天学习打卡营第20天|应用实践之RNN实现情感分类

基本介绍 今天的应用实践是RNN实现情感分类,情感分类是自然语言处理中的经典任务,是典型的分类问题。RNN是一种循环神经网络,接收序列数据作为输入。模型训练所采用的数据集是IMDB影评数据集,数据集包含Positive和Negative两类。由…

Weird LCM Operations

我们先观察,有 ⌊ n 6 ⌋ \lfloor \frac{n}{6} \rfloor ⌊6n​⌋,我们如果每次操作三个不同的数,也需要 n 3 \frac{n}{3} 3n​次操作,所以我们考虑只操作一半的序列 跟一半有关的东西大概有:奇偶,前一半后…

数据库基础-进阶

数据库管理: *sql语句 数据库用来增删改查的语句 *** 备份 数据库的数据进行备份 * 主从复制,读写分离,高可用 原理 数据库的概念和相关的语法和规范: 数据库:组织,存储,管理数据的仓库。 数据…

Flutter中的异步操作

在Flutter及其底层语言Dart中,异步操作主要通过以下几种方式实现: Future: Future是Dart的一个核心类,用于表示一个可能在未来某个时间点返回结果的计算。当一个函数执行可能耗时的操作时(如网络请求、文件读写等)&am…

cpp 强制转换

一、static_cast static_cast 是 C 中的一个类型转换操作符,用于在类的层次结构中进行安全的向上转换(从派生类到基类)或进行不需要运行时类型检查的转换。它主要用于基本数据类型之间的转换、对象指针或引用的向上转换(即从派生…

在Linux上,你可以使用命令行工具来修改计算机的IP地址

在Linux上,你可以使用命令行工具来修改计算机的IP地址。以下是一些常见的方法: 使用ifconfig命令(传统方法) 查看当前网络接口配置: ifconfig找到你要修改的网络接口,例如eth0。 设置新的IP地址&#xff…

富格林:深思曝光纠正安全误区

富格林指出,在投资市场上,投资者进行任何交易都是以安全盈利为出发点的,伦敦金交易也不例外。投资者在进入市场做单之前可从曝光的骗局中深究亏损原因,总结应对策略预防在交易中遇到类似情况导致亏损。以下是富格林总结曝光的几点…

数据结构第32节 无锁编程

在Java中,无锁编程是一种在多线程环境下避免使用传统锁机制(如synchronized关键字或ReentrantLock)的技术。这种技术可以提高程序的并发性能,尤其是在高并发场景下,因为它减少了锁的竞争和上下文切换的开销。 数据结构…

【Java】读取超大文件的时候,如何避免出现OOM

读取超大文件的时候,如何避免出现OOM 需求背景如下: 从文件中读取数据并经过业务处理后存储到数据库中,同时避免出现OOM(Out of Memory) 1、使用分批处理文件数据 将文件数据分批读取,每次只处理一部分数…

深入理解 React 的 useSyncExternalStore Hook

深入理解 React 的 useSyncExternalStore Hook 大家好,今天我们来聊聊 React 18 引入的一个新 Hook:useSyncExternalStore。这个 Hook 主要用于与外部存储同步状态,特别是在需要确保状态一致性的场景下非常有用。本文将深入探讨这个 Hook 的…

GB和GiB的区别

GB(Gigabyte,十亿字节)和GiB(Gibibyte,吉比字节)都是数据存储单位,但它们有不同的定义和使用场景。 GB(Gigabyte) 定义: GB使用十进制系统,1 GB …

Linux系统中通过Wine运行软件实现关机功能

概述 在Linux系统中,我们开发的软件通过Wine进行适配。软件中包含一个需要执行关机操作的功能。然而,发现Windows的关机指令在Linux环境中无效,需要单独设置Linux的关机命令。 一、调用关机脚本文件执行关机 在Linux系统中,可以…

redis存入hash,key=>value和key=>(key=>value)使用Python举例

在 Redis 中,HASH 数据结构(也称为 HMAP 或 Hash Map)允许你存储键值对集合,其中每个键值对都是字段(field)和值(value)的映射。在 Python 中,你可以使用 redis-py 库来与…