C# 方法、委托与事件
一、今天要讲什么今天主要讲 3 个 C# 中非常重要的概念方法Method委托Delegate事件Event它们之间的关系可以简单理解为方法 ↓ 委托 ↓ 事件一句话理解方法负责干活委托负责传递方法事件负责通知别人。二、什么是方法2.1 方法是什么方法就是一段可以被重复调用的代码。例如void SayHello() { Console.WriteLine(你好); }调用SayHello();运行结果你好我们可以把方法理解成一个“功能”。例如SayHello() → 打招呼 Add() → 计算 Connect() → 连接设备 Capture() → 拍照 SaveImage() → 保存图片在实际的上位机项目中我们会大量使用方法。三、方法的基本结构一个方法通常包含访问修饰符 返回值类型 方法名(参数) { // 方法里面的代码 }例如public int Add(int a, int b) { return a b; }调用int result Add(10, 20); ​ Console.WriteLine(result);结果303.1 参数是什么参数就是调用方法的时候传进去的数据。void SayHello(string name) { Console.WriteLine(你好 name); }调用SayHello(小明);这里name就是参数。四、为什么需要委托先看一个问题。假设我们有两个方法void SayHello() { Console.WriteLine(你好); } void SayBye() { Console.WriteLine(再见); }我们可以直接调用SayHello(); SayBye();但是如果我们希望把一个方法当成“数据”传给另一个方法。普通方法就不方便了。这时候就需要委托 Delegate五、什么是委托委托可以简单理解成委托就是一个可以保存“方法”的变量。例如Action action;然后action SayHello;现在action ↓ SayHello()调用action();实际上执行的就是SayHello();六、最简单的委托例子using System; class Program { static void SayHello() { Console.WriteLine(你好); } static void Main() { Action action SayHello; action(); } }运行你好七、Action 是什么Action是 C# 已经帮我们定义好的委托。例如Action表示没有参数 没有返回值例如void SayHello() { Console.WriteLine(你好); }可以Action action SayHello;7.1 Action 有参数例如Actionstring action;表示有一个 string 参数 没有返回值所以void SayHello(string name) { Console.WriteLine(你好 name); }可以Actionstring action SayHello; action(小明);7.2 Action 多个参数例如Actionstring, int表示string int 没有返回值例如void Test(string name, int age) { Console.WriteLine(name); Console.WriteLine(age); }可以Actionstring, int action Test; action(小明, 20);八、Func 是什么除了ActionC# 还有Func它和 Action 最大的区别Func 有返回值。例如int Add(int a, int b) { return a b; }可以Funcint, int, int func Add; int result func(10, 20);结果30这里Funcint, int, int最后一个int是返回值。所以Funcint, int, int ↑ ↑ ↑ 参数 参数 返回值九、为什么委托很重要委托最大的意义之一可以把“具体执行什么”交给别人决定。例如void Test(Action action) { Console.WriteLine(开始执行); action(); Console.WriteLine(执行结束); }调用Test(SayHello);也可以Test(SayBye);这样Test()不需要知道具体执行的是SayHello还是SayBye它只负责调用传进来的方法。十、什么是事件事件event事件本质上是建立在委托基础上的。可以简单理解事件就是一种“通知机制”。例如相机拍照完成 ↓ 通知程序 ↓ 保存图片 ↓ 更新界面或者TCP收到数据 ↓ 触发事件 ↓ 通知Form1 ↓ 显示数据十一、生活中的事件例子可以把事件理解成学校 ↓ 下课铃响 ↓ 通知学生老师不需要一个个告诉学生张三下课 李四下课 王五下课只需要铃声响订阅了这个铃声的人就知道下课了C# 的事件也是类似的。十二、最简单的事件先定义一个事件public event Actionstring DataReceived;这里event ↓ 事件 Actionstring ↓ 事件发生时需要传递一个 string触发事件DataReceived?.Invoke(收到数据);这里?.表示如果这个事件有人订阅就调用它。十三、事件的完整例子定义一个设备类class Device { public event Actionstring DataReceived; public void ReceiveData() { string data Hello; DataReceived?.Invoke(data); } }然后 Form 中Device device new Device(); device.DataReceived Device_DataReceived;事件处理方法private void Device_DataReceived(string data) { Console.WriteLine(收到 data); }调用device.ReceiveData();最终Device ↓ ReceiveData() ↓ DataReceived事件 ↓ Device_DataReceived() ↓ 收到Hello十四、 是什么意思订阅事件device.DataReceived Device_DataReceived;可以理解为当 DataReceived 事件发生的时候调用Device_DataReceived。取消订阅device.DataReceived - Device_DataReceived;所以 ↓ 订阅 - ↓ 取消订阅十五、委托和事件有什么区别这是非常容易被问到的问题。委托委托Actionstring action;可以action Test;可以直接调用action(Hello);事件事件public event Actionstring DataReceived;外部通常只能DataReceived Test;或者DataReceived - Test;外部不能随便DataReceived(Hello);真正触发事件通常由事件所属的类自己完成DataReceived?.Invoke(Hello);所以可以简单理解委托更自由事件更强调“只能订阅和取消订阅”。十六、为什么实际项目大量使用事件因为很多设备都是设备发生事情 ↓ 程序需要知道 ↓ 通知程序例如串口收到数据 TCP收到数据 相机拍照完成 PLC状态发生变化 定时器到时间 按钮被点击这些都非常适合事件。十七、结合 TCP 项目理解例如我们以前写 TCP 的时候public event Actionstring DataReceived;TCP 收到数据string data Hello; DataReceived?.Invoke(data);Form1 订阅_client.DataReceived Client_DataReceived;然后private void Client_DataReceived(string data) { richTextBox1.AppendText(data); }整个过程TCP客户端 ↓ 收到数据 ↓ DataReceived事件 ↓ Form1 ↓ 显示数据这样 TCP 类就不需要知道“收到数据以后到底应该显示在哪里”TCP 类只需要“我收到数据了我通知你。”这就是事件解耦的一种体现。十八、结合串口项目理解串口同样可以public event Actionbyte[] DataReceived;收到数据byte[] data serialPort.Read(...); DataReceived?.Invoke(data);其他类订阅serial.DataReceived Serial_DataReceived;这样串口 ↓ 收到数据 ↓ 事件 ↓ 业务代码 ↓ 解析数据十九、结合视觉项目理解在视觉项目中也可以使用事件。例如public event ActionICogImage ImageGrabbed;相机拍到图片ImageGrabbed?.Invoke(image);Form_camera.ImageGrabbed Camera_ImageGrabbed;然后private void Camera_ImageGrabbed(ICogImage image) { cogRecordDisplay1.Image image; }流程康耐视相机 ↓ 拍照 ↓ 得到 ICogImage ↓ ImageGrabbed事件 ↓ Form1 ↓ 显示图像二十、方法、委托、事件的关系可以画成方法 │ ↓ 可以被委托保存 │ ↓ 委托 │ ↓ 可以建立事件 │ ↓ 事件 │ ↓ 通知其他对象二十一、三者最简单的理解方法我自己干活。void SayHello() { Console.WriteLine(你好); }委托我把“干什么”交给别人。Action action SayHello; action();事件我干完了/发生事情了我通知你。public event Actionstring DataReceived;发生事情DataReceived?.Invoke(收到数据);二十二、一个完整的小例子using System; class Device { // 定义事件 public event Actionstring DataReceived; // 模拟设备接收数据 public void Receive() { string data 设备发送的数据; // 触发事件 DataReceived?.Invoke(data); } } class Program { static void Main() { Device device new Device(); // 订阅事件 device.DataReceived Device_DataReceived; // 模拟接收数据 device.Receive(); } static void Device_DataReceived(string data) { Console.WriteLine(收到 data); } }运行收到设备发送的数据二十三、几个小问题问题1什么是委托可以回答委托是 C# 中用于封装方法的类型可以把方法作为参数传递也可以保存方法的引用。问题2什么是事件可以回答事件是建立在委托基础上的一种通知机制常用于一个对象发生某件事情以后通知其他对象。问题3委托和事件有什么区别可以回答委托可以直接赋值和调用而事件主要用于订阅和取消订阅事件的触发通常由事件所属的类内部完成。问题4Action 和 Func 有什么区别可以回答Action 表示没有返回值的委托Func 表示有返回值的委托Func 的最后一个泛型参数表示返回值类型。问题5?.Invoke()是什么意思例如DataReceived?.Invoke(data);意思是如果DataReceived当前有人订阅就调用这个事件如果没人订阅就什么也不做避免空引用异常。二十四、最后总结今天主要学习方法 ↓ 完成具体功能 委托 ↓ 保存/传递方法 事件 ↓ 发生事情后通知其他对象最重要的一句话方法负责干活委托负责传递方法事件负责通知别人。在实际的 C# 上位机开发中TCP收到数据 ↓ 事件 串口收到数据 ↓ 事件 相机拍照完成 ↓ 事件 PLC状态变化 ↓ 事件所以委托和事件是 C# 做设备通信、UI程序、上位机程序时非常重要的基础知识。二十五、推荐学习顺序如果继续深入 C#可以按照变量 ↓ 条件判断 ↓ 循环 ↓ 方法 ↓ 类和对象 ↓ 继承 ↓ 接口 ↓ 委托 ↓ 事件 ↓ 泛型 ↓ LINQ ↓ Task / async / await ↓ 多线程 ↓ 反射 ↓ 依赖注入对于上位机开发建议重点掌握C# ↓ 面向对象 ↓ 委托 / 事件 ↓ 异步 / Task ↓ TCP / 串口 ↓ 数据库 ↓ WinForms / WPF ↓ VisionPro ↓ PLC / Modbus

相关新闻

再见了,Redis之神:Antirez留给开源世界的遗产

再见了,Redis之神:Antirez留给开源世界的遗产

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 5:04:07 阅读更多 →
用HelloAgents写A2A多Agent系统,代码量直接少了一半

用HelloAgents写A2A多Agent系统,代码量直接少了一半

用HelloAgents写A2A多Agent系统,代码量直接少了一半 写在前面 上一篇文章我们用原生A2A SDK写了两个Agent的协作,代码量不小——要自己管理Agent Card、处理任务状态、维护会话、写HTTP服务……跑通是跑通了,但写起来确实有点繁琐。 这篇文章…

2026/10/15 5:04:07 阅读更多 →
基于 SpringBoot+Vue 的数字化文创作品展览与电商交易服务平台的设计与实现

基于 SpringBoot+Vue 的数字化文创作品展览与电商交易服务平台的设计与实现

选题背景与意义 随着数字技术的迅猛发展和文化消费模式的深刻变革,传统文化与现代科技的融合已成为推动文化产业转型升级的重要路径。在这一背景下,数字化文创作品展览与电商交易服务平台应运而生,成为连接创作者、消费者与文化资源的关键桥梁…

2026/10/15 5:04:07 阅读更多 →

最新新闻

深度学习学习率热身(Warmup)原理与工程实践指南

深度学习学习率热身(Warmup)原理与工程实践指南

1. 为什么“热身”不是可有可无的仪式,而是训练稳定性的第一道保险“学习率热身”(Learning Rate Warmup)这个词,在刚接触深度学习的开发者眼里,常常被当成论文里一个带点玄学色彩的超参技巧——“别人用了&#xff0c…

2026/10/15 5:50:37 阅读更多 →
2026 国企干部人才测评选型指南,合规要求全面覆盖

2026 国企干部人才测评选型指南,合规要求全面覆盖

一、选型这件事,比想象中复杂选错一套人才测评系统,代价可能超出预算本身——干部选拔的依据站不住,巡视审计时拿不出完整证据链,才是真正棘手的问题。2026年,国企改革深化提升行动进入收官阶段,管理人员竞…

2026/10/15 5:50:37 阅读更多 →
多因子房价预测实战:从数据清洗到业务可解释建模

多因子房价预测实战:从数据清洗到业务可解释建模

1. 为什么“多因子房价预测”不能只靠Excel画散点图?我第一次接到某地产咨询公司委托,做一套能实际用于区域楼盘定价参考的预测模型时,对方发来的初版需求文档里赫然写着:“用Excel做几个变量和房价的散点图,挑相关性最…

2026/10/15 5:50:37 阅读更多 →
华为OD机考真题拆解:状态模拟与进制转换的四大解题模板

华为OD机考真题拆解:状态模拟与进制转换的四大解题模板

简介:面向华为OD机考备考者,这份精选100道经典真题的docx文档覆盖5键键盘输出、N进制减法、报数游戏等高频题型,并配有参考实现与思路拆解,适合具备一定编程基础、希望在考前快速熟悉题型与考察重点的考生。文档以Java代码示例呈现…

2026/10/15 5:50:37 阅读更多 →
PyTorch本质是可编程张量计算系统,不是传统深度学习框架

PyTorch本质是可编程张量计算系统,不是传统深度学习框架

1. 项目概述:PyTorch不是“框架”,而是一套可编程的张量计算系统你点开这个标题,大概率是刚接触深度学习,或者正被某个模型训练卡住、被报错信息绕晕,又或者在选型时反复纠结——到底该学TensorFlow还是PyTorch&#x…

2026/10/15 5:50:37 阅读更多 →
51单片机八路抢答器:防误触发+双定时器协同+硬件级锁定

51单片机八路抢答器:防误触发+双定时器协同+硬件级锁定

简介:本资源是一份面向电子类专业学生与单片机初学者的完整课程设计文档,聚焦基于AT89C51单片机实现八路抢答器的软硬件全流程方案,解决课堂实践、课程设计及小型竞赛场景中抢答控制、编号锁定、声光提示等核心功能实现问题。文档为纯Word格式…

2026/10/15 5:49:37 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →