C# 委託(Delegate)與事件(Event)筆記

news/2025/11/3 3:28:00/文章来源:https://www.cnblogs.com/yugawakun/p/19185736

C# 委託(Delegate)與事件(Event)筆記

📝 C# 委託(Delegate)與事件(Event)筆記

1️⃣ 委託(Delegate)

定義

委託是一種方法指標(方法的變數),可以存放、傳遞方法。

// 定義委託
delegate void MyDelegate(string message);// 方法符合委託簽名
void SayHello(string msg) => Console.WriteLine("Hello " + msg);// 使用委託
MyDelegate d = SayHello;
d("World"); // Hello World

特性

  • 可以指向一個或多個方法
  • 方法簽名必須與委託一致
  • 支持 多播(Multicast)

2️⃣ 多播委託(Multicast Delegate)

概念

一個委託可以同時指向多個方法,呼叫時依序執行。

void Hello() => Console.WriteLine("Hello");
void World() => Console.WriteLine("World");MyDelegate d = Hello;
d += World; // 加入另一個方法d(); 
// 輸出:
// Hello
// World

注意事項

  1. 使用 += 加入方法,-= 移除方法
  2. 有回傳值的多播委託,只保留最後一個方法的回傳值
delegate int MyDelegate();int A() { Console.WriteLine("A"); return 1; }
int B() { Console.WriteLine("B"); return 2; }MyDelegate d = A;
d += B;int result = d(); // 呼叫 A 和 B
Console.WriteLine(result); // 2

3️⃣ 事件(Event)

定義

事件是封裝好的多播委託,提供安全的通知機制。
外部只能訂閱(+=)或退訂(-=),不能直接觸發事件。

public class Button
{public event Action? OnClick; // 定義事件public void Click() // 事件觸發方法(只能在類內呼叫){OnClick?.Invoke();}
}

使用方式

var button = new Button();// 訂閱事件
button.OnClick += () => Console.WriteLine("Listener 1");
button.OnClick += () => Console.WriteLine("Listener 2");// 觸發事件
button.Click();
// 輸出:
// Listener 1
// Listener 2

4️⃣ 委託 vs 事件對比

比較項 委託(Delegate) 事件(Event)
本質 方法指標 封裝的多播委託
外部可否訂閱
外部可否觸發 ❌(只能類內觸發)
常用場景 傳遞方法、回呼函式 UI事件、資料變更通知
多播 支援 支援

5️⃣ 常用技巧

  • 安全觸發事件
OnClick?.Invoke(); // ?避免 null reference
  • 查看多播委託清單
foreach (var m in d.GetInvocationList())
{Console.WriteLine(m.Method.Name);
}
  • 事件參數
public event EventHandler? OnCompleted;void RaiseEvent() => OnCompleted?.Invoke(this, EventArgs.Empty);

6️⃣ 核心理解

  1. 委託 = 方法的變數,可單播或多播
  2. 多播委託 = 可以同時指向多個方法
  3. 事件 = 封裝多播委託,用於通知、保障安全觸發
  4. 事件訂閱者(listener)是「觀察者模式」的典型應用

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

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

相关文章

点特征 - MKT

点特征 核心差异与总结维度与信息层次的不同:ORB和BSC是局部描述符: 它们只描述一个点周围的非常局部的信息(纹理或几何)。它们不知道这个点属于“椅子”还是“桌子”。 KPConv特征是点特征: 它是在整个点云的上下…

正弦化作用 - MKT

正弦化作用是谁最新想到这个正弦化处理,怎么想到的?这是一个非常深刻的问题,触及了深度学习领域一个精彩的创新故事。这个想法的出现不是一蹴而就的,而是一个演进的过程。简单来说,最先将正弦函数用于编码连续信息…

不同域的阿里邮箱 跨域搬家方法

================# 水平有限 欢迎指正 #=================

第三节课内容,dos的部分基础命令

mod应用 打开开始+系统+命令提示符 win+R(建议,且最喜欢使用) 选择任意文件,shift+鼠标右键,打开命令行窗口 在资源管理器中,任意文件链接前加上cmd路径(管理员方式运行,选择以管理员方式运行)常用的dos命令盘…

OK3506-S12 Mini开发板+基本使用环境配置

OK3506-S12 Mini开发板开箱和基本使用(飞凌嵌入式) 开箱包裹内容打开包装,你可以看到以下物品usb typec线 OK3506-S12 Mini开发板图1 OK3506-S12 Mini开发板图2 OK3506-S12 Mini开发板 开发板简介RK3506J/RK3506B是…

C#中异常处理的使用例子 - 开源研究系列文章

C#中异常处理的使用例子 - 开源研究系列文章Posted on 2025-11-03 00:30 lzhdim 阅读(0) 评论(0) 收藏 举报 应用的异常处理在应用里是比较常见的使用,一般情况下尽量不使用try-catch来捕获异常并处理,而…

windows系统Ollama私有化模型部署

windows系统Ollama私有化模型部署 一.安装Ollama 在官网下载https://ollama.com/download

【UE工具向】如何优雅的扩展DataTable ToolBar

如何优雅的向DataTable上方ToolBar区域新增功能按钮 近期终于抽出空来把之前做的一些小东西整理出来,希望能对你有帮助问题背景:只要是大量使用DT的项目我想都会遇到想要"一键处理XXX"的需求,比如是一键打…

亲爱的伊利斯

亲爱的伊利斯:人们总说,我写作的时候一定正受着什么折磨,而现在折磨我的人就是你。你的一切让我备受折磨。我想到你的高跟鞋,你的刘海,你闪闪发亮的短靴,你房间窗户下镶着一排小石头的拖鞋。我想到你的手指按电视…

go清单

golang 中 make 和 new 的区别? for range 的时候它的地址会发生变化么? 能介绍下 rune 类型吗? 调用函数传入结构体时,应该传值还是指针? goroutine什么情况下会阻塞? 讲讲 Go 的 select 底层数据结构和一些特性…

MySQL_进阶

存储引擎MySQl体系结构存储引擎简介存储引擎特点存储引擎的选择

团队项目1-团队展示选题-星瀚餐递

项目 内容所属课程 https://edu.cnblogs.com/campus/gdgy/Class12Grade23ComputerScience作业要求 https://edu.cnblogs.com/campus/gdgy/Class12Grade23ComputerScience/homework/13471作业目标 介绍团队基本情况,确…

2025-11-02 闲话

2025-11-02 闲话浅析狗叫行为。 今天读了一下李新野的新 latex pdf 《人妻约会指南》。不得不让我回顾我自己和异性的 social 行为。我听说有些朋友是不太需要和异性 social 的,我认为我好像还不是这样。 我认为我不能…

DRL-SARSA

SARSA算法 1. 引言 SARSA(State-Action-Reward-State-Action)是一种重要的强化学习算法,属于时序差分(Temporal Difference, TD)控制方法。它通过直接学习动作价值函数Q(s,a)来解决强化学习问题。与Q-learning不同…

2025.10.20~2025.10.26

2025.10.20~2025.10.262022HDU多校08 A 由于只能选择奇数长度的段进行反转,因此奇偶性不同的两个位置永远不能实现交换。 而取长度为 \(3\) 的段总能使相邻两个奇偶性相同的位置进行交换,因此只需对奇子列和偶子列分…

Day10复合选择器

复合选择器分为后代选择器,子代选择器,交集选择器和并集选择器 1.后代选择器即跨过父类,而在该父类下的所有该后代选择器所对应的标签都会被应用 <!DOCTYPE html> <html lang="en"> <head…

2025.10.27~2025.11.02

2025.10.27~2025.11.022022HDU多校09 A Problem \(T\) 组数据。给定一个长为 \(n\) 的数列 \(a\),判断是否能将其重排为数列 \(b\) 使 \(b\) 中不存在 \(1 \le i < j < k \le n \and a_{j} - a_{i} = a_{k} - a…

一次 Windows 内核卡住的调试经历

记录一次 Windows 内核卡住的调试经历一次 Windows 内核卡住的调试经历 今年整了个电脑,本想提升生活游戏体验,却被一个及其影响体验的问题折磨了三个月,后来终于算是得到了解决(规避)。过程是曲折的,结果是比较…

SQCTF-web

SQCTF-web小小查询系统 Upload_Level1 Upload_Level2 baby_rce 无参之舞 千查万别 eeaassyy ez-include 内部威胁情报监控平台 ez-sqli 黑客终端 PHP的XXE PHP的后门 CTF商城 Easy_SQLi EasyMD5 雏形系统 简单越权 inc…

websocket在秒杀场景下连接过多的问题

这可能是很多人第一次在高并发场景(尤其是秒杀活动)引入 WebSocket 时最容易忽略的隐患点之一。 有两点非常关键:1️⃣ 高并发场景下 WebSocket 连接数过多; 2️⃣ WebSocket 是否占用 Spring Boot / Tomcat 的 We…