在C#编程中,委托(Delegate) 是一种非常强大的特性,它允许我们将方法作为参数传递。而当多个方法需要被同一个委托调用时,就引出了 C#委托链 和 多播委托 的概念。本教程将从零开始,带你一步步理解委托链的拼接原理,并通过代码示例掌握 C#事件机制 背后的核心思想。
普通的委托只能指向一个方法,而多播委托(Multicast Delegate)可以指向多个方法。这些方法会按照添加的顺序依次执行,形成一条“委托链”。
在C#中,所有委托都继承自 System.MulticastDelegate 类,因此天然支持多播。我们通过 += 操作符将多个方法“拼接”到同一个委托实例上。
下面是一个简单的例子,展示如何使用 += 拼接多个方法:
using System;// 定义一个无返回值、无参数的委托delegate void MyDelegate();class Program{ static void Main() { // 创建委托实例 MyDelegate del = MethodA; // 拼接 MethodB del += MethodB; // 再拼接 MethodC del += MethodC; // 调用委托链 —— 会依次执行 A → B → C del(); Console.WriteLine("\n--- 分隔线 ---\n"); // 移除某个方法 del -= MethodB; del(); // 现在只执行 A → C } static void MethodA() => Console.WriteLine("执行了 MethodA"); static void MethodB() => Console.WriteLine("执行了 MethodB"); static void MethodC() => Console.WriteLine("执行了 MethodC");} 运行结果:
执行了 MethodA执行了 MethodB执行了 MethodC--- 分隔线 ---执行了 MethodA执行了 MethodC
如果委托有返回值(非 void),多播委托只会返回最后一个方法的值。例如:
delegate int NumberDelegate();static int GetOne() => 1;static int GetTwo() => 2;static int GetThree() => 3;static void Main(){ NumberDelegate nd = GetOne; nd += GetTwo; nd += GetThree; int result = nd(); // 只返回 3 Console.WriteLine($"最终返回值: {result}"); // 输出:最终返回值: 3} 如果你需要获取所有方法的返回值,可以使用 GetInvocationList() 手动遍历:
foreach (var method in nd.GetInvocationList()){ int val = (int)method.DynamicInvoke(); Console.WriteLine($"调用结果: {val}");} C#的事件(Event)机制正是基于多播委托实现的。一个事件可以注册多个处理方法,当事件被触发时,所有订阅者都会被通知。
public class Button{ // 定义一个事件 public event Action Click; public void OnClick() { Click?.Invoke(); // 触发所有订阅的方法 }}class Program{ static void Main() { var btn = new Button(); btn.Click += () => Console.WriteLine("保存数据"); btn.Click += () => Console.WriteLine("关闭窗口"); btn.Click += () => Console.WriteLine("记录日志"); btn.OnClick(); }} 输出:
保存数据关闭窗口记录日志
通过本教程,你已经掌握了:
+= 和 -= 拼接/移除方法理解 委托拼接 是掌握C#高级特性的关键一步,它不仅用于事件系统,还广泛应用于回调、观察者模式等设计场景。建议你动手实践上述代码,加深理解!
© 2024 C# 编程指南 | 掌握核心,轻松进阶
本文由主机测评网于2025-12-26发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/20251212753.html