当前位置: 首页 > news >正文

C# 中的事件和委托:构建响应式应用程序

C#中的事件和委托。事件和委托是C#中用于实现观察者模式和异步回调的重要机制,它们在构建响应式和交互式应用程序中发挥着重要作用。以下是一篇关于C#中事件和委托的文章。

引言

事件和委托是C#语言中非常重要的特性,它们允许你实现观察者模式和异步回调,从而构建响应式和交互式应用程序。本文将详细介绍C#中的委托和事件,包括它们的基本概念、使用方法和应用场景。

委托的基本概念

什么是委托?

委托(Delegate)是一种类型安全的函数指针,它允许你将方法作为参数传递给另一个方法。委托可以引用具有相同签名的方法,并且可以在运行时动态调用这些方法。

定义委托

委托的定义使用 delegate 关键字,后面跟着返回类型和参数列表。

public delegate void MyDelegate(string message);

使用委托

定义委托后,可以创建委托实例并调用它。

public class Program
{public static void Main(){MyDelegate myDelegate = new MyDelegate(ShowMessage);myDelegate("Hello, World!");}public static void ShowMessage(string message){Console.WriteLine(message);}
}

多播委托

委托支持多播,即一个委托实例可以引用多个方法。调用多播委托时,会依次调用所有引用的方法。

public class Program
{public static void Main(){MyDelegate myDelegate = new MyDelegate(ShowMessage1);myDelegate += ShowMessage2;myDelegate("Hello, World!");}public static void ShowMessage1(string message){Console.WriteLine("Method 1: " + message);}public static void ShowMessage2(string message){Console.WriteLine("Method 2: " + message);}
}

事件的基本概念

什么是事件?

事件(Event)是基于委托的特殊成员,用于在对象之间传递通知。事件允许一个对象(事件发布者)通知其他对象(事件订阅者)发生了某种情况。

定义事件

事件的定义使用 event 关键字,后面跟着委托类型。

public class Publisher
{// 定义事件public event EventHandler MyEvent;// 触发事件的方法public void RaiseEvent(){OnMyEvent();}// 触发事件的保护方法protected virtual void OnMyEvent(){MyEvent?.Invoke(this, EventArgs.Empty);}
}

订阅和触发事件

订阅事件时,使用 += 运算符将事件处理方法绑定到事件。触发事件时,调用事件处理方法。

public class Subscriber
{public void HandleEvent(object sender, EventArgs e){Console.WriteLine("事件被触发了!");}
}public class Program
{public static void Main(){Publisher publisher = new Publisher();Subscriber subscriber = new Subscriber();// 订阅事件publisher.MyEvent += subscriber.HandleEvent;// 触发事件publisher.RaiseEvent();// 取消订阅事件publisher.MyEvent -= subscriber.HandleEvent;}
}

应用场景

观察者模式

事件和委托是实现观察者模式的理想选择。观察者模式允许一个对象(主题)在其状态改变时通知其他对象(观察者)。

public class Subject
{public event EventHandler StateChanged;public void ChangeState(){Console.WriteLine("状态已改变");OnStateChanged();}protected virtual void OnStateChanged(){StateChanged?.Invoke(this, EventArgs.Empty);}
}public class Observer
{public void OnSubjectStateChanged(object sender, EventArgs e){Console.WriteLine("观察者收到通知");}
}public class Program
{public static void Main(){Subject subject = new Subject();Observer observer = new Observer();subject.StateChanged += observer.OnSubjectStateChanged;subject.ChangeState();subject.StateChanged -= observer.OnSubjectStateChanged;}
}

异步回调

委托也常用于实现异步回调,允许在异步操作完成后执行特定的代码。

public delegate void AsyncCallback(string result);public class AsyncOperation
{public void StartAsyncOperation(AsyncCallback callback){// 模拟异步操作Task.Run(() =>{Thread.Sleep(2000);string result = "异步操作完成";callback(result);});}
}public class Program
{public static void Main(){AsyncOperation asyncOperation = new AsyncOperation();asyncOperation.StartAsyncOperation(result =>{Console.WriteLine(result);});Console.WriteLine("异步操作已启动,主线程继续执行...");}
}

结论

通过使用事件和委托,可以构建响应式和交互式的应用程序。事件允许对象之间传递通知,而委托则提供了类型安全的函数指针机制。希望本文能够帮助你更好地理解和应用C#中的事件和委托技术。如果你有任何疑问或需要进一步的信息,请随时留言讨论!


希望这篇关于C#中事件和委托的文章对你有所帮助。如果有任何问题或需要进一步的信息,请随时告诉我!

相关文章:

C# 中的事件和委托:构建响应式应用程序

C#中的事件和委托。事件和委托是C#中用于实现观察者模式和异步回调的重要机制,它们在构建响应式和交互式应用程序中发挥着重要作用。以下是一篇关于C#中事件和委托的文章。 引言 事件和委托是C#语言中非常重要的特性,它们允许你实现观察者模式和异步回…...

科技赋能健康:多商户Java版商城系统引领亚健康服务数字化变革

在当今社会,随着生活节奏的加快和工作压力的增大,越来越多的人处于亚健康状态。据《The Lancet》期刊2023年的统计数据显示,全球亚健康状态的人群比例已高达82.8%,这一数字背后,隐藏着巨大的健康风险和社会成本。亚健康…...

区块链网络示意图;Aura共识和Grandpa共识(BFT共识)

目录 区块链网络示意图 Aura共识和Grandpa共识(BFT共识) Aura共识 Grandpa共识(BFT共识) Aura与Grandpa的结合 区块链网络示意图 CP Blockchain:这是中央处理区块链(或可能指某种特定的处理单元区块链)的缩写。它可能代表了该区块链网络的主要处理或存储单元。在这…...

Javaweb梳理18——JavaScript

今日目标 掌握 JavaScript 的基础语法掌握 JavaScript 的常用对象(Array、String)能根据需求灵活运用定时器及通过 js 代码进行页面跳转能通过DOM 对象对标签进行常规操作掌握常用的事件能独立完成表单校验案例 18.1 JavaScript简介 JavaScript 是一门跨…...

面向对象-接口的使用

1. 接口的概述 为什么有接口? 借口是一种规则,对于继承而言,部分子类之间有共同的方法,为了约束方法的使用,使用接口。 接口的应用: 接口不是一类事物,它是对行为的抽象。 2. 接口的定义和使…...

失落的Apache JDBM(Java Database Management)

简介 Apache JDBM(Java Database Management)是一个轻量级的、基于 Java 的嵌入式数据库管理系统。它主要用于在 Java 应用程序中存储和管理数据。这个项目已经过时了,只是发表一下以示纪念,现在已经大多数被SQLite和Derby代替。…...

Vue3+SpringBoot3+Sa-Token+Redis+mysql8通用权限系统

sa-token支持分布式token 前后端代码,地球号: bright12389...

MySQL 三大日志详解

在 MySQL 数据库中,binlog(二进制日志)、redo log(重做日志)和 undo log(回滚日志)起着至关重要的作用。它们共同保障了数据库的高可用性、数据一致性和事务的可靠性。下面将对这三大日志进行详…...

Java 岗面试八股文及答案整理(2024最新版)

春招,秋招,社招,我们 Java 程序员的面试之路,是挺难的,过了 HR,还得被技术面,小刀在去各个厂面试的时候,经常是通宵睡不着觉,头发都脱了一大把,还好最终侥幸能…...

Web3.0安全开发实践:Clarity最佳实践总结

在过去的一段时间里,CertiK团队对比特币生态系统及其发展进行了深入研究。同时,团队还审计了多个比特币项目以及基于不同编程语言的智能合约,包括OKX的BRC-20钱包和MVC DAO的sCrypt智能合约实现。 现在,我们的研究重点转向了Clar…...

基于Springboot+Vue动漫推荐平台管理系统(源码+lw+讲解部署+PPT)

前言 详细视频演示 论文参考 系统介绍 系统概述 核心功能 用户角色与功能 具体实现截图 1. 热门动漫功能 2. 文章专栏功能 3. 会员分享功能 4. 热门动漫管理功能(管理员端) 5. 动漫分类管理功能 技术栈 后端框架SpringBoot 前端框架Vue …...

秋意浓,森林披金装

秋意浓,森林披金装, 枫叶如火,漫山遍野狂。 松间轻风送寒意, 鸟鸣悠扬入云翔。 林间小径蜿蜒行, 落叶铺成金色毯。 溪水潺潺绕石转, 映出天边一抹霞。 野菊点缀在草间, 白云悠悠随意闲。…...

Chrome离线安装包下载

1、问Chrome的官网:https://www.google.cn/chrome/ 直接下载的是在线安装包,安装需要联网。 2、如果需要在无法联网的设备上安装Chrome,需要在上面的地址后面加上?standalone1。 Chrome离线安装包下载地址:https://www.google.c…...

安卓手机5G网络频繁掉4G 问题解决 手机5G网络优化方案

问题环境 在某个长期停留的位置(例如:躺平)使用手机时网络突然从5G跳到4G,偶尔跳来跳去导致网络体验很差,经过调整5G网络情况下网速及其他体验都要更好,基于这样的情况使用一种简单的操作,锁定5…...

使用LLaMA-Factory微调时的问题与解决方案记录

文章目录 如何指定微调使用的显卡如何解决显卡通信导致的报错模型微调的实际epoch和step如何计算如何实现多卡全量微调模型微调后的结果如何查看模型测试后的指标如何理解如何指定微调使用的显卡 启动网页时使用这种执行命令 CUDA_VISIBLE_DEVICES=5,6,7 llamafactory-cli we…...

Go语言switch语句

在Go语言中,switch,是一个高度灵活,其功能强大的控制结构,相比较Java中的switch,更受到语言重视。 目录 1.基础用法2.多值匹配3.不指定表达式的 switch4.使用 fallthrough 强制进入下一个分支5.使用类型断言的 switch…...

JavaScript DOM使用

DOM Document Object Model 简单而言,就是JavaScript将HTML文档的各个组成部分封装为对象。 封装的对象分别为: Document:整个HTML的文档对象 Element:元素对象(也就是HTML中的标签) Attribute:…...

人工智能|计算机视觉——微表情识别(Micro expression recognition)的研究现状

一、简述 微表情是一种特殊的面部表情,与普通的表情相比,微表情主要有以下特点: 持续时间短,通常只有1/25s~1/3s;动作强度低,难以察觉;在无意识状态下产生,通常难以掩饰或伪装;对微表情的分析通常需要在视频中,而普通表情在图像中就可以分析。由于微表情在无意识状态…...

耿恭坚守城池的方法

疏勒城之战中,耿恭坚守城池的方法主要有以下几点: 选择有利地势:耿恭深知疏勒城依山傍水、地势险要,易守难攻,于是果断放弃金满城,移师至疏勒城据守,为长期坚守创造了良好的地理条件.运用心理战…...

小兔鲜项目总结——项目亮点

目录 1、基于业务的逻辑组件拆分思想2、长页面吸顶交互的实现3、自定义图片懒加载指令并封装为插件4、画板插槽组件等业务通用组件封装5、通用逻辑函数的封装6、列表无限加载7、路由缓存问题的处理 小兔鲜项目其实在暑假之前就已经做完了,但是一直没有空做总结&…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...

day52 ResNet18 CBAM

在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

Java 加密常用的各种算法及其选择

在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...