04委托Delegate和事件Event
一、委托(Delegate)
委托是一个类,定义了方法的类型,使方法可以当作另一个方法的参数进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。
委托是一个安全的函数指针,.NET中的委托是类型安全的,委托会检测它所保存的函数引用是否和声明的委托匹配。
public delegate void MyDelegate(string message); internal class Program { public void ShowMessage(string message) { Console.WriteLine("Message: " + message); } static void Main(string[] args) { //1、实例化委托并绑定方法 MyDelegate myDelegate = new MyDelegate(new Program().ShowMessage); //调用委托 myDelegate("Hello, World!"); //2、使用Func委托 Func<int, int, int> add = (a, b) => a + b; //调用Func委托 int result = add(5, 10); Console.WriteLine("Result: " + result); //3、使用Action委托 Action<string> printMessage = (message) => Console.WriteLine("Message: " + message); //调用Action委托 printMessage("Hello, Action!"); } }
内置的委托对象
Delegate 至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型 Func<> 可以接受0个至16个传入参数,必须具有返回值 Action<> 可以接受0个至16个传入参数,无返回值
二、事件(Event)
事件是一种特殊的委托,用于实现发布-订阅模式,允许对象在特定的情况下通知其他对象。
主要用于实现回调函数、处理用户界面交互等。
// 定义事件委托 public delegate void MyEventHandler(object sender, EventArgs e); // 定义包含事件的类 public class MyEventClass { public event MyEventHandler MyEvent; // 触发事件的方法 public void RaiseEvent() { MyEvent?.Invoke(this, EventArgs.Empty); } } // 订阅事件的方法 public class EventSubscriber { public void HandleEvent(object sender, EventArgs e) { Console.WriteLine("Event handled by EventSubscriber"); } } internal class Program { static void Main(string[] args) { // 使用事件 MyEventClass myObject = new MyEventClass(); EventSubscriber subscriber = new EventSubscriber(); // 订阅事件 myObject.MyEvent += subscriber.HandleEvent; // 触发事件 myObject.RaiseEvent(); } }
三、两者区别:
相同点:
- 都基于委托: 事件本质上是一种特殊的委托,事件声明和使用都依赖于委托类型。
- 都支持多播: 委托和事件都支持多个方法的绑定,可以同时调用多个方法。
不同点:
- 语法和用途: 委托用于直接调用方法或实现回调,而事件更多用于实现发布-订阅模式,让对象在状态改变时通知其他对象。
- 封装性: 事件具有更高的封装性,外部类不能直接调用触发事件的方法,而委托没有这种封装性。
- 事件在类中声明,委托可在任何地方声明和使用。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2021-09-06 LADP认证接入
2021-09-06 Identity Server基础