C# 多播委托

一、多播委托 核心概念

1. 什么是多播委托

普通委托:一个委托变量只能绑定一个方法

多播委托:一个委托变量可以绑定【多个方法】

通过 += 绑定追加方法-= 移除解绑方法

调用委托时,会依次执行当前绑定的所有方法

2. 语法规则

  • 委托变量 += 方法:追加绑定方法

  • 委托变量 -= 方法:移除绑定方法

  • 执行顺序:先绑先执行

  • 多播委托只适合无返回值 void 委托(有返回值会被最后一个覆盖)


二、委托三种调用方式(复习巩固)

cs 复制代码
// 1. 直接调用方法
F1("ss");

// 2. 委托变量间接调用
m8("aaa");

// 3. Invoke 原生调用
m8.Invoke("bbb");

// 4. 空安全调用(最规范)
m8?.Invoke("ccc");

三、多播委托基础绑定演示

写法1:完整 new 绑定

cs 复制代码
MyDel m1 = new MyDel(F1);       // 绑定F1
m1 += new MyDel(new Test().F2); // 追加绑定F2
m1("周星驰");
// 执行顺序:F1 → F2

写法2:简化写法(常用)

cs 复制代码
MyDel m2 = F1;
m2 += new Test().F2;
m2("吴孟达");

四、多播委托 移除方法 -= 详解(重点)

1. 正常移除成功

cs 复制代码
MyDel m2 = F1;
m2 += new Test().F2;

m2 -= F1; // 移除F1
m2("元华");
// 只剩 F2 执行

五、超级大坑:实例方法移除失败(必考错题)

1. 错误代码:永远移除不掉

cs 复制代码
MyDel m3 = F1;
m3 += new Test().F2;  
// 这里是【新对象A】的F2

m3 -= new Test().F2; 
// 这里是【新对象B】的F2
// A和B不是同一个对象!无法匹配,移除失败!

m3("梅艳芳"); 
// F2 依然执行

核心原理(必背)

  • 实例方法属于对象

  • new Test() 每次都是全新对象,内存地址不同

  • 委托移除机制:必须是同一个对象的同一个方法才能移除

  • 两次 new 产生两个不同对象,无法匹配,移除失效


六、两种正确移除方案(标准答案)

方案1:实例方法 → 提取统一对象(推荐)

cs 复制代码
MyDel m4 = F1;
Test t1 = new Test(); // 唯一对象
m4 += t1.F2;
m4 -= t1.F2; // 同一个对象,精准移除

m4("张国荣");
// 只剩 F1 执行

方案2:使用静态方法(无对象依赖,百分百成功)

cs 复制代码
MyDel m5 = F1;
m5 += Test.F3;  // 静态方法
m5 -= Test.F3;  // 静态方法直接匹配,无需对象
m5("周润发");

静态方法不属于对象,属于类,不存在对象不同的问题


七、多播委托总结规则

  • += 追加绑定,-= 解绑移除

  • 多播委托按绑定顺序依次执行所有方法

  • 实例方法移除必须保证是同一个对象

  • 静态方法移除无对象困扰,最稳定

  • 每次 new 都是新对象,实例方法直接 -= 必失败


八、面试高频问答

问:为什么两次 new 对象的实例方法无法从多播委托中移除?

答:实例方法依赖对象实例,两次 new 创建了两个不同内存地址的对象,委托内部比对的是【对象+方法】,对象不一致,匹配失败,所以无法移除。

问:多播委托为什么一般用 void 无返回值?

答:如果多个方法都有返回值,最终只能保留最后一个方法的返回值,前面返回值全部被覆盖,无意义。


九、满分背诵口诀

  • 多播委托可叠加,+=绑定 -=删

  • 先绑先跑顺序定,批量执行很简单

  • 实例方法坑最深,两次new删不掉

  • 统一对象才可删,静态方法最安全

相关推荐
FungLeo15 分钟前
Flutter Web 中文字体困境与渲染器选择:CanvasKit vs HTML renderer 实战
前端·flutter·html
BD_Marathon26 分钟前
部署Spark
大数据·javascript·spark
敲代码的玉米C37 分钟前
我修的那个 bug,制造了另一个 bug
前端·人工智能·架构
gis开发之家1 小时前
《Vue3 从入门到大神50篇》Vue3 源码详解(二十):生命周期钩子源码解析 —— onMounted / onUpdated 如何实现?
前端·javascript·前端框架·vue3·vue3源码
全栈项目管理程序猿1 小时前
ArcGIS JS 基础教程(9):天空盒与大气效果
javascript
Narrastory1 小时前
我用 Claude Code 写代码不到 2 小时,却花了 3 天做完这个软件—Vibe Coding 的正确姿势,是设计不是生成
前端·人工智能·github
Enaium1 小时前
我实现了KMP的SDL绑定并编写了高性能软光追
前端·kotlin
唐青枫1 小时前
别再手写 args[0]:C#.NET CommandLineParser 命令行工具实战详解
c#·.net
古夕1 小时前
本地正常线上白屏:一次路由切换后刷新恢复问题的排查与修复
前端·ai编程
栀鸢ouo1 小时前
解决Element Plus表格展开行横向溢出、滚动截断问题(项目实战方案)
前端·vue.js