c#事件案例与分析

devtools/2025/3/15 0:33:57/
using System;
using System.Collections.Generic;namespace EventExample
{// 定义事件数据public class DataReceivedEventArgs : EventArgs{public string Data { get; }public DataReceivedEventArgs(string data){Data = data;}}// 发布者类public class Publisher{// 定义事件public event EventHandler<DataReceivedEventArgs> DataReceived;// 模拟数据接收public void ReceiveData(string data){Console.WriteLine("Publisher: Receiving data...");OnDataReceived(data);}// 触发事件protected virtual void OnDataReceived(string data){try{DataReceived?.Invoke(this, new DataReceivedEventArgs(data));}catch (Exception ex){Console.WriteLine($"Error while notifying subscribers: {ex.Message}");}}}// 订阅者类public class Subscriber{private readonly string _name;public Subscriber(string name){_name = name;}// 处理事件的方法public void OnDataReceived(object sender, DataReceivedEventArgs e){if (e == null || string.IsNullOrEmpty(e.Data)){Console.WriteLine($"{_name} received empty data.");return;}Console.WriteLine($"{_name} received data: {e.Data}");}}class Program{static void Main(string[] args){// 创建发布者Publisher publisher = new Publisher();// 创建订阅者Subscriber subscriber1 = new Subscriber("Subscriber 1");Subscriber subscriber2 = new Subscriber("Subscriber 2");// 订阅事件publisher.DataReceived += subscriber1.OnDataReceived;publisher.DataReceived += subscriber2.OnDataReceived;// 模拟接收数据publisher.ReceiveData("Hello, World!");// 取消订阅publisher.DataReceived -= subscriber1.OnDataReceived;// 再次模拟接收数据publisher.ReceiveData("Goodbye, World!");Console.ReadLine();}}
}

1. 事件定义
首先,在 Publisher 类中定义了一个事件 DataReceived,它的类型是 EventHandler<DataReceivedEventArgs>。这意味着该事件可以传递一个 DataReceivedEventArgs 类型的参数,通常用于包含与事件相关的数据。

public event EventHandler<DataReceivedEventArgs> DataReceived;
2. 事件处理方法
在 Subscriber 类中定义了一个方法 OnDataReceived,这个方法将会作为事件处理程序(event handler)来处理 DataReceived 事件。当事件被触发时,OnDataReceived 方法会被调用,并接收事件的发出者(sender)和事件数据(DataReceivedEventArgs)作为参数。

public void OnDataReceived(object sender, DataReceivedEventArgs e)
{
    // 处理事件
}
3. 订阅事件
publisher.DataReceived += subscriber1.OnDataReceived; 这行代码的作用是将 subscriber1 的 OnDataReceived 方法注册为 publisher 的 DataReceived 事件的处理程序。具体的执行逻辑如下:

事件订阅:使用 += 运算符将 subscriber1.OnDataReceived 方法添加到 DataReceived 事件的事件处理列表中。这意味着,当 DataReceived 事件被触发时,所有订阅了该事件的方法(包括 subscriber1.OnDataReceived)都会被调用。
4. 事件触发
在 Publisher 类中,有一个方法 OnDataReceived,它会触发 DataReceived 事件。这个方法会检查是否有订阅者,并调用它们的事件处理方法:

protected virtual void OnDataReceived(string data)
{
    DataReceived?.Invoke(this, new DataReceivedEventArgs(data));
}
5. 事件处理
当调用 publisher.ReceiveData("Hello, World!"); 时,会触发 DataReceived 事件,导致 OnDataReceived 方法被调用。所有订阅了 DataReceived 事件的方法都会被执行。在这种情况下,subscriber1.OnDataReceived 将会被调用,并传入 publisher 作为 sender 和包含数据 "Hello, World!" 的 DataReceivedEventArgs 对象。

总结
publisher.DataReceived += subscriber1.OnDataReceived; 是将 subscriber1 的 OnDataReceived 方法注册为事件处理程序的过程。
当 DataReceived 事件被触发时,所有注册的处理程序(包括 subscriber1.OnDataReceived)会被依次调用,处理相关的事件数据。
这种机制使得发布者(Publisher)和订阅者(Subscriber)之间实现了松耦合的关系,发布者不需要知道具体的订阅者,只需触发事件即可。


http://www.ppmy.cn/devtools/166643.html

相关文章

项目上传到Gitee过程

在gitee上新建一个仓库 点击“克隆/下载”获取仓库地址 电脑上要装好git 在电脑本地文件夹右键“Git Bash Here” 依次执行如下命令 git init git remote add origin https://gitee.com/qlexcel/stm32-simple.git git pull origin master git add . git commit -m ‘init’…

vue3 element-plus form校验不生效

vue3 element-plus form校验不生效 明明输入框已经填写了值&#xff0c;但是还是校验没有值&#xff0c;是因为form没有绑定 model 注意form上要写:model"form" const form reactive({nodeName: null,id: null,name: null,})const rules reactive({nodeName: [{…

如何将本地已有的仓库上传到gitee (使用UGit)

1、登录Gitee。 2、点击个人头像旁边的加号&#xff0c;选择新建仓库&#xff1a; 3、填写仓库相关信息 4、复制Gitee仓库的地址 5、绑定我们的本地仓库与远程仓库 6、将本地仓库发布&#xff08;推送&#xff09;到远程仓库&#xff1a; 注意到此处报错&#xff…

用OpenCV写个视频播放器可还行?(Python版)

引言 提到OpenCV&#xff0c;大家首先想到的可能是图像处理、目标检测&#xff0c;但你是否想过——用OpenCV实现一个带进度条、倍速播放、暂停功能的视频播放器&#xff1f;本文将通过一个实战项目&#xff0c;带你深入掌握OpenCV的视频处理能力&#xff0c;并解锁以下功能&a…

腾讯云TBDS获金融信创实验室全项适配认证 打造国产化大数据平台标杆

点击蓝字⬆ 关注我们 本文共计1605字 预计阅读时长5分钟 近日&#xff0c;腾讯云大数据套件软件TBDS V5.3、数据仓库TCHouse V3.0通过金融信创生态实验室&#xff08;以下简称“实验室”&#xff09;的适配验证。 本测试基于典型金融业务场景&#xff0c;在全信创环境下&#x…

【H2O2 | 软件开发】事件循环机制

目录 前言 开篇语 准备工作 正文 概念 流程 事件队列类型 示例 结束语 前言 开篇语 本系列为短篇&#xff0c;每次讲述少量知识点&#xff0c;无需一次性灌输太多的新知识点。该主题文章主要是围绕前端、全栈开发相关面试常见问题撰写的&#xff0c;希望对诸位有所帮…

PostgreSQL 的登陆方式(本地和远程)

本次分享一下PostgreSQL 的登陆方式&#xff0c;本地登录和远程登录&#xff0c;今天就展开讲一下。 本地登录&#xff1a; 如果看了我的第一篇PostgreSQL安装&#xff0c;在末尾的时候为了方便大家操作&#xff08;启动、关闭、登录&#xff09;PostgreSQL&#xff0c;我这边…

使用 Python pandas操作 Excel 文件

使用 Python pandas 操作 Excel 文件 flyfish pandas 是 Python 中一个强大的数据处理和分析库&#xff0c;它提供了丰富的数据结构&#xff08;如 Series 和 DataFrame&#xff09;和数据操作方法&#xff0c;能够方便地处理各种数据格式&#xff0c;包括 Excel 文件。 安装…