C#中,什么是委托,什么是事件及它们之间的关系

1. 委托(Delegate)

定义与作用
  • 委托‌是类型安全的函数指针,用于封装方法,支持多播(链式调用)。
  • 核心能力‌:将方法作为参数传递或异步回调。
使用场景
  1. 回调机制(如异步操作完成通知)。
  2. 实现策略模式(动态替换算法逻辑)。
  3. LINQ查询中的条件筛选(Where(x => x > 6))。
  4. 多播委托(多个方法依次执行)。
示例代码
// 定义委托 
public delegate void LogHandler(string message); 
/ 使用委托public class Processor 
{ public void RunTask(LogHandler logger) 
{ logger("Task started.");
// ...业务逻辑 logger("Task completed."); 
} 
} // 调用方 
var processor = new Processor(); 
processor.RunTask(message => Console.WriteLine($"[LOG] {message}")); 

2. 事件(Event)

定义与作用
  • 事件‌是基于委托的语法糖,强制封装性,遵循‌发布-订阅模式‌。
  • 核心规则‌:只能在声明类内部触发(Invoke),外部仅能+=-=订阅。
使用场景
  1. GUI事件(按钮点击、鼠标移动)。
  2. 观察者模式(状态变化通知)。
  3. 松耦合系统(组件间通信)。
示例代码
// 定义事件public class OrderService 
{ 
public event EventHandler<OrderEventArgs> OrderSubmitted; 
public void SubmitOrder(Order order) 
{ 
// ...提交订单逻辑 
OnOrderSubmitted(new OrderEventArgs(order));} 
protected virtual void OnOrderSubmitted(OrderEventArgs e) 
{ OrderSubmitted?.Invoke(this, e); } } 
// 订阅事件 var service = new OrderService();service.OrderSubmitted += (sender, e) => { 
Console.WriteLine($"Order {e.OrderId} submitted!");}; 

3. 委托与事件的关系

特性委托事件
封装性可被外部直接调用只能在声明类内触发
多播支持支持
安全性低(外部可修改委托链)高(外部仅订阅/取消)
典型用途灵活的方法传递系统级通知(如UI交互)

关键点总结

  1. 委托是基础‌:事件本质是受限的委托,编译器自动生成add/remove方法。
  2. 设计原则‌:
    • 事件用于‌被动通知‌(如用户操作)。
    • 委托用于‌主动传递逻辑‌(如回调函数)。
  3. 代码规范‌:事件命名使用动词(如Clicked/DataReceived),委托命名用Handler后缀。

疑问与解决方案

Q1:为什么事件比委托更安全?
A1:事件禁止外部直接赋值(=操作符),强制通过+=-=管理订阅,避免覆盖其他订阅者。

Q2:何时选择自定义委托而非Action/Func
A2:需要明确语义时

(如public delegate void PriceChangedHandler(double oldPrice)优于Action<double>)。

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

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

相关文章

从替代到超越,禅道国产化替代解决方案2.0发布!

3月22日&#xff0c;由禅道携手上海惠艾信息科技、麦哲思科技共同举办的禅道・中国行北京站活动圆满落下帷幕。 除深入探究AI赋能研发项目管理外&#xff0c;禅道在活动现场正式发布了《禅道国产化替代解决方案2.0》&#xff0c;助力企业全方位构建自主可控的研发项目管理新体…

【VirtualBox 安装 Ubuntu 22.04】

网上教程良莠不齐&#xff0c;有一个CSDN的教程虽然很全面&#xff0c;但是截图冗余&#xff0c;看蒙了给我&#xff0c;这里记录一个整洁的教程链接。以备后患。 下载安装全流程 UP还在记录生活&#xff0c;看的我好羡慕&#xff0c;呜呜。 [VirtualBox网络配置超全详解]&am…

2025美国网络专线国内服务商推荐

在海外业务竞争加剧的背景下&#xff0c;稳定高效的美国网络专线已成为外贸企业、跨国电商及跨国企业的刚需。面对复杂的国际网络环境和严苛的业务要求&#xff0c;国内服务商Ogcloud凭借其创新的SD-WAN技术架构与全球化网络布局&#xff0c;正成为企业拓展北美市场的优选合作伙…

2.2.2 引入配置文件和定义配置类

本实战通过三种方式实现Spring Boot中的配置加载与管理。首先&#xff0c;通过PropertySource加载自定义配置文件&#xff0c;结合ConfigurationProperties注解将配置文件中的属性绑定到Java类中&#xff0c;实现配置的灵活管理。其次&#xff0c;利用ImportResource加载XML配置…

Django:构建高性能Web应用

引言&#xff1a;为何选择Django&#xff1f; 在当今快速发展的互联网时代&#xff0c;Web应用的开发效率与可维护性成为开发者关注的核心。Django作为一款基于Python的高级Web框架&#xff0c;以其"开箱即用"的特性、强大的ORM系统、优雅的URL路由设计&#xff0c;…

【银河麒麟高级服务器操作系统 】虚拟机运行数据库存储异常现象分析及处理全流程

更多银河麒麟操作系统产品及技术讨论&#xff0c;欢迎加入银河麒麟操作系统官方论坛 https://forum.kylinos.cn 了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer…

《2核2G阿里云神操作!Ubuntu+Ollama低成本部署Deepseek模型实战》

简介&#xff1a; “本文为AI开发者揭秘如何在阿里云2核2G轻量级ECS服务器上&#xff0c;通过Ubuntu系统与Ollama框架实现Deepseek模型的高效部署。无需昂贵硬件&#xff0c;手把手教程涵盖环境配置、资源优化及避坑指南&#xff0c;助力初学者用极低成本在云端跑通行业领先的大…

【bug解决】NameError: name ‘fused_act_ext‘ is not defined

问题 使用basicsr库做超分的时候发现NameError: name fused_act_ext is not defined这个问题&#xff0c;一直不断重复的使用pip uninstall basicsr 和 BASICSR_EXTTrue pip install basicsr 发现一直没有执行编译过程&#xff0c;导致一直推理失败 原因 之前已经安装过basi…

Anaconda开始菜单里添加JupyterLab快捷方式

Anaconda开始菜单里添加JupyterLab快捷方式 在 Windows 系统安装 Anaconda 后&#xff0c;发现开始菜单只有 Jupyter Notebook&#xff0c;却找不到Jupyter Lab入口。其实这是因为最新版 Anaconda 默认未预装 Lab 组件&#xff0c;本篇介绍一种添加 Jupyter Lab入口到开始菜单…

【Qt】modbus客户端笔记

Qt 中基于 Modbus 协议的通用客户端学习笔记 一、概述 本客户端利用 Qt 的 QModbusTcpClient 实现与 Modbus 服务器的通信&#xff0c;具备连接、读写寄存器、心跳检测、自动重连等功能&#xff0c;旨在提供一个可靠且易用的 Modbus 客户端框架&#xff0c;方便在不同项目中集…

解决Vmware 运行虚拟机Ubuntu22.04卡顿、终端打字延迟问题

亲测可用 打开虚拟机设置&#xff0c;关闭加速3D图形 &#xff08;应该是显卡驱动的问题&#xff0c;不知道那个版本的驱动不会出现这个问题&#xff0c;所以干脆把加速关了&#xff09;

【网络】Socket套接字

目录 一、端口号 二、初识TCP/UDP协议 三、网络字节序 3.1 概念 3.2 常用API 四、Socket套接字 4.1 概念 4.2 常用API &#xff08;1&#xff09;socket &#xff08;2&#xff09;bind sockaddr结构 &#xff08;3&#xff09;listen &#xff08;4&#xff09;a…

内联函数/函数重载/函数参数缺省

一、内联函数 为了减少函数调用的开销 在函数定义前加“inline”关键字&#xff0c;即可定义内联函数 二、函数重载 1.名字相同 2.参数个数或者参数类型不同 编译器根据调用语句实参的个数和类型判断应该调用哪个函数 三、函数的缺省参数 定义函数的时候可以让最右边的连…

基于神经网络的文本分类的设计与实现

标题:基于神经网络的文本分类的设计与实现 内容:1.摘要 在信息爆炸的时代&#xff0c;大量文本数据的分类处理变得至关重要。本文旨在设计并实现一种基于神经网络的文本分类系统。通过构建合适的神经网络模型&#xff0c;采用公开的文本数据集进行训练和测试。在实验中&#x…

Baklib内容中台的核心定位是什么?

构建企业级知识中枢 在数字化转型趋势下&#xff0c;Baklib内容中台通过构建企业级知识中枢&#xff0c;实现了从碎片化信息到体系化资产的跃迁。其核心能力体现为对多源内容的智能聚合与结构化存储&#xff0c;支持从文档、图片到视频的全格式整合&#xff0c;并通过语义标签…

蓝耘平台API深度剖析:如何高效实现AI应用联动

目录 一、蓝耘平台简介 1.1 蓝耘通义大模型 1.2 蓝耘云计算资源 1.3 蓝耘API与微服务 二、 蓝耘平台应用联动场景 2.1 数据采集与预处理联动 2.2 模型推理与后端服务联动 2.3 跨平台联动 三、蓝耘平台注册体验功能 3.1 注册 3.2 体验蓝耘MaaS平台如何使用海螺AI生成视频…

《大语言模型赋能证券业开发安全:海云安技术方案在上交所专刊发表》

近日&#xff0c;海云安《大语言模型在证券业开发安全领域的探索与实践》技术方案经过上海证券交易所&#xff08;以下简称”上交所“&#xff09;行业专家评审后正式收录于《交易技术前沿——网络安全专刊&#xff08;2025年第1期 总第61期&#xff09;》。 证券信息技术研究…

第三课:Stable Diffusion图生图入门及应用

文章目录 Part01 图生图原理Part02 图生图基本流程Part03 随机种子作用解析Part04 图生图的拓展应用 Part01 图生图原理 当提示词不能足够表达用户需求的时候&#xff0c;加入图片能让AI更好的理解你的想法图片上的像素信息会在加噪和去噪的过程中&#xff0c;作为一种特征反映…

将网络安全和第三方风险管理与业务目标相结合

在网络安全风险领域&#xff0c;我们经常遇到与企业语言不通的问题。这可能导致网络安全风险管理计划得不到支持。当发现网络安全风险时&#xff0c;困难在于以符合组织语言和目标的方式来表达它。 第三方风险属于另一个灰色地带。在组织内部&#xff0c;许多利益相关者&#…

使用Github项目nghttp3的样例学习HTTP/3

文章目录 前言一、HTTP3测试 in Ubuntu1.1. 基本软件1.2. gcc/g1.2.1. Ubuntu221.2.2. Ubuntu201.2.2.1. 必备库1.2.2.1.1. gmp1.2.2.1.2. mpfr1.2.2.1.3. mpc 1.2.2.2. 安装 1.3. libev > 4.11&#xff08;备用&#xff09;1.3.1. 安装1.3.2. 测试 1.4. nghttp31.5. ngtcp2…