.NET 事件模式举例介绍

news2025/6/8 19:23:29

.NET 事件模式:实现对象间松耦合通信

在软件开发中,对象之间的通信是一个常见且重要的问题。.NET 框架提供了一种标准化的事件模式,用于解决对象间的通信问题,实现松耦合的交互方式。今天,我们就通过一个简单的例子来深入了解.NET 事件模式的应用。

事件模式概述

事件模式是一种用于对象间通信的机制,它允许一个对象在发生特定事件时通知其他对象。这种通信方式的好处在于,它实现了对象之间的松耦合,即事件的发送者不需要知道哪些对象对该事件感兴趣,也不需要直接调用这些对象的方法,从而提高了代码的可维护性和可扩展性。

示例场景

假设我们有一个简单的应用程序,其中包含一个“计数器”对象。这个计数器对象有一个“值改变”的事件,当计数器的值发生变化时,它会触发这个事件。其他对象可以订阅这个事件,以便在计数器值改变时执行相应的操作。

步骤 1:定义事件参数类

首先,我们需要定义一个继承自 EventArgs 的子类,用于封装与“值改变”事件相关的数据。这个子类可以包含新旧值等属性。以下是示例代码:

using System;

public class CounterChangedEventArgs : EventArgs
{
    public int OldValue { get; private set; }
    public int NewValue { get; private set; }

    public CounterChangedEventArgs(int oldValue, int newValue)
    {
        OldValue = oldValue;
        NewValue = newValue;
    }
}

在这段代码中,CounterChangedEventArgs 类继承自 EventArgs,并包含了 OldValueNewValue 两个属性,用于存储计数器的新旧值。构造函数用于初始化这两个属性。

步骤 2:声明事件并实现事件触发逻辑

接下来,在计数器类中,我们声明一个事件,并使用 EventHandler<CounterChangedEventArgs> 委托类型。这个委托类型接受两个参数:事件的发送者(通常为 object 类型)和包含事件数据的 EventArgs 对象。以下是计数器类的示例代码:

using System;

public class Counter
{
    private int _value;

    // 声明事件
    public event EventHandler<CounterChangedEventArgs> ValueChanged;

    // 计数器值改变的方法
    public void Increment(int amount)
    {
        int oldValue = _value;
        _value += amount;
        int newValue = _value;

        // 创建事件参数对象
        CounterChangedEventArgs args = new CounterChangedEventArgs(oldValue, newValue);

        // 触发事件
        OnValueChanged(args);
    }

    // 受保护的虚方法,用于触发事件
    protected virtual void OnValueChanged(CounterChangedEventArgs e)
    {
        // 检查是否有订阅者
        ValueChanged?.Invoke(this, e);
    }
}

在这个类中,ValueChanged 是一个事件,使用 EventHandler<CounterChangedEventArgs> 委托类型。Increment 方法用于增加计数器的值,并在值改变时创建事件参数对象,然后调用 OnValueChanged 方法触发事件。OnValueChanged 方法会检查是否有订阅者,如果有,则调用委托的 Invoke 方法触发事件。

步骤 3:订阅事件并处理事件

现在,其他对象或类可以订阅计数器的“值改变”事件,并提供一个事件处理程序。当计数器的值改变时,所有订阅了事件的处理程序都会被调用。以下是一个示例类,用于订阅和处理事件:

public class Program
{
    private Counter counter;

    public Program()
    {
        counter = new Counter();

        // 订阅ValueChanged事件
        counter.ValueChanged += Counter_ValueChanged;
    }

    private void Counter_ValueChanged(object sender, CounterChangedEventArgs e)
    {
        // 处理事件,例如打印新旧值
        Console.WriteLine($"Counter value changed from {e.OldValue} to {e.NewValue}.");
    }

    public static void Main(string[] args)
    {
        Program program = new Program();

        // 增加计数器的值,这将触发ValueChanged事件
        program.counter.Increment(5);
    }
}

Program 类中,我们创建了一个 Counter 对象,并订阅了其 ValueChanged 事件。当调用 counter.Increment(5) 方法时,计数器的值会增加,并触发 ValueChanged 事件。随后,Counter_ValueChanged 方法会被调用,并打印出计数器的新旧值。

总结

通过标准.NET 事件模式,我们实现了一个松耦合的通信机制。计数器对象不需要知道哪些对象对其值改变感兴趣,也不需要直接调用这些对象的方法。相反,它只负责在值改变时触发事件。而订阅了事件的对象则负责处理这些事件,实现了关注点分离和代码解耦。

这种事件模式在.NET 框架中广泛应用,不仅限于简单的计数器示例,还可以应用于更复杂的场景,如 UI 控件的事件处理、多线程通信等。它提供了一种清晰、一致且灵活的方式来处理对象间的通信,提高了代码的可维护性和可扩展性。

在实际开发中,合理运用事件模式可以让我们的代码更加简洁、易于维护,同时也能提高代码的可测试性。希望通过这个简单的例子,你能对.NET 事件模式有更深入的理解,并在自己的项目中灵活运用。 ======================================================================
前些天发现了一个比较好玩的人工智能学习网站,通俗易懂,风趣幽默,可以了解了解AI基础知识,人工智能教程,不是一堆数学公式和算法的那种,用各种举例子来学习,读起来比较轻松,有兴趣可以看一下。
人工智能教程

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

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

相关文章

PDF 转 Markdown

本地可部署的模型 Marker Marker 快速准确地将文档转换为 markdown、JSON 和 HTML。 转换所有语言的 PDF、图像、PPTX、DOCX、XLSX、HTML、EPUB 文件在给定 JSON 架构 &#xff08;beta&#xff09; 的情况下进行结构化提取设置表格、表单、方程式、内联数学、链接、引用和代…

北大开源音频编辑模型PlayDiffusion,可实现音频局部编辑,比传统 AR 模型的效率高出 50 倍!

北大开源了一个音频编辑模型PlayDiffusion&#xff0c;可以实现类似图片修复(inpaint)的局部编辑功能 - 只需修改音频中的特定片段&#xff0c;而无需重新生成整段音频。此外&#xff0c;它还是一个高性能的 TTS 系统&#xff0c;比传统 AR 模型的效率高出 50 倍。 自回归 Tra…

蒲公英盒子连接问题debug

1、 现象描述 2、问题解决 上图为整体架构图&#xff0c;其中左边一套硬件设备是放在机房&#xff0c;右边是放在办公室。左边的局域网连接了可以访问外网的路由器&#xff0c;利用蒲公英作为旁路路由将局域网暴露在外网环境下。 我需要通过蒲公英作为旁路路由来进行远程访问&…

Unity | AmplifyShaderEditor插件基础(第五集:简易膨胀shader)

一、&#x1f44b;&#x1f3fb;前言 大家好&#xff0c;我是菌菌巧乐兹~本节内容主要讲一下&#xff0c;如何用shader来膨胀~ 效果预览&#xff1a; 二、&#x1f4a8;膨胀的基本原理 之前的移动是所有顶点朝着一个方向走&#xff0c;所以是移动 如果所有顶点照着自己的方…

WINUI——Magewell视频捕捉开发手记

背景 因需要融合视频&#xff0c;并加载患者CT中提取出的气管镜与病变&#xff0c;以便能实时查看气管镜是否在正确位置。 开发环境 硬件&#xff1a;Magewell的USB Capture HDMI Gen 2 IDE&#xff1a;VS2022 FrameWork: .Net6 WINUI Package: MVVMToolKit NLog Ma…

TDengine 开发指南——无模式写入

简介 在物联网应用中&#xff0c;为了实现自动化管理、业务分析和设备监控等多种功能&#xff0c;通常需要采集大量的数据项。然而&#xff0c;由于应用逻辑的版本升级和设备自身的硬件调整等原因&#xff0c;数据采集项可能会频繁发生变化。为了应对这种挑战&#xff0c;TDen…

第34次CCF-CSP认证真题解析(目标300分做法)

第34次CCF-CSP认证 矩阵重塑&#xff08;其一&#xff09;AC代码及解析矩阵重塑&#xff08;其二&#xff09;AC代码及解析货物调度AC代码及解析 矩阵重塑&#xff08;其一&#xff09; 输入输出及样例&#xff1a; AC代码及解析 1.线性化原矩阵 &#xff1a;由于cin的特性我们…

video-audio-extractor:视频转换为音频

软件介绍 前几天在网上看见有人分享了一个源码&#xff0c;大概就是py调用的ffmpeg来制作的。 这一次我带来源码版&#xff08;需要py环境才可以运行&#xff09;&#xff0c;开箱即用版本&#xff08;直接即可运行&#xff09; 软件特点 软件功能 视频提取音频&#xff1a…

[概率论基本概念4]什么是无偏估计

关键词&#xff1a;Unbiased Estimation 一、说明 对于无偏和有偏估计&#xff0c;需要了解其叙事背景&#xff0c;是指整体和抽样的关系&#xff0c;也就是说整体的叙事是从理论角度的&#xff0c;而估计器原理是从实践角度说事&#xff1b;为了表明概率理论&#xff08;不可…

PL/SQLDeveloper中数值类型字段查询后显示为科学计数法的处理方式

PL/SQLDeveloper中数值类型字段查询后显示为科学计数法的处理方式 文章目录 PL/SQLDeveloper中数值类型字段查询后显示为科学计数法的处理方式1. 查询效果2. 处理方式3. 再次查询 1. 查询效果 2. 处理方式 3. 再次查询

【vue】Uniapp 打包Android 文件选择上传问题详解~

需求 uniapp兼容android app&#xff0c;pc&#xff0c;h5的文件选择并上传功能。 需要支持拍照和相册选择&#xff0c;以及选择其他类型文件上传~ 实践过程和问题 开始使用uni-file-picker组件 以为很顺利&#xff0c;android模拟器测试…… 忽略了平台兼容性提示~&#…

Ctrl-Crash 助力交通安全:可控生成逼真车祸视频,防患于未然

视频扩散技术虽发展显著&#xff0c;但多数驾驶数据集事故事件少&#xff0c;难以生成逼真车祸图像&#xff0c;而提升交通安全又急需逼真可控的事故模拟。为此&#xff0c;论文提出可控车祸视频生成模型 Ctrl-Crash&#xff0c;它以边界框、碰撞类型、初始图像帧等为条件&…

网络编程之服务器模型与UDP编程

一、服务器模型 在网络通信中&#xff0c;通常要求一个服务器连接多个客户端 为了处理多个客户端的请求&#xff0c;通常有多种表现形式 1、循环服务器模型 一个服务器可以连接多个客户端&#xff0c;但同一时间只能连接并处理一个客户的请求 socket() 结构体 bind() listen() …

Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五模型时序预测

Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五模型时序预测 目录 Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五模型时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五…

阿里云服务器安装nginx并配置前端资源路径(前后端部署到一台服务器并成功访问)

​​​运行以下命令&#xff0c;安装Nginx相关依赖。 yum install -y gcc-c yum install -y pcre pcre-devel yum install -y zlib zlib-devel yum install -y openssl openssl-devel 运行wget命令下载Nginx 1.21.6。 您可以通过Nginx开源社区直接获取对应版本的安装包URL&…

C++11新增重要标准(下)

前言 一&#xff0c;forward&#xff08;完美转发&#xff09; 二&#xff0c;可变参数模板 三&#xff0c;emplace系列接口 四&#xff0c;新增类功能 五&#xff0c;default与delete 六&#xff0c;lambda表达式 七&#xff0c;包装器 八&#xff0c;bind 在C11中新增…

【第六篇】 SpringBoot的日志基础操作

简介 日志系统在软件开发中至关重要&#xff0c;用于调试代码、记录运行信息及错误堆栈。本篇文章不仅详细介绍了日志对象的创建及快速使用&#xff0c;还说明了日志持久化的两种配置方式和滚动日志的设置。实际开发需根据场景选择合适的日志级别和存储策略。文章内容若存在错误…

Pluto论文阅读笔记

主要还是参考了这一篇论文笔记&#xff1a;https://zhuanlan.zhihu.com/p/18319150220 Pluto主要有三个创新点&#xff1a; 横向纵向用lane的query来做将轨迹投回栅格化地图&#xff0c;计算碰撞loss对数据进行正增强和负增强&#xff0c;让正增强的结果也无增强的结果相近&a…

matlab 2024a ​工具箱Aerospsce Toolbox报错​

Matlab R2024a中Aerospsce Toolbox报错 警告&#xff1a;Aerospace Toolbox and Aerospace Blockset licenses are required in ‘built-in/Spacecraft Dynamics’ 找到安装路径\MATLAB\R2024a\licenses文件夹license_****_R2024a.lic 里面工具箱名称出错&#xff0c;手动修改…

使用有限计算实现视频生成模型的高效训练

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 视频生成的最新进展需要越来越高效的训练配方&#xff0c;以减轻不断上升的计算成本。在本报告中&#xff0c;我们介绍了 ContentV&#xff0c;这是一种 8B 参数文本到视频模型&#xff0c;在 256 …