委托是方法的类型,用于保存方法引用并实现回调;事件是封装后的委托,支持安全的订阅与通知机制。通过订单系统案例,定义委托OrderEventHandler和事件OnOrderCreated,订单服务在创建成功后触发事件,邮件、库存等服务通过订阅实现各自逻辑,实现解耦与扩展。使用?.Invoke避免空引用,推荐EventHandler<T>泛型形式,确保松耦合与可维护性。

委托和事件是C#中非常核心的机制,尤其在处理回调、解耦组件、实现观察者模式时特别有用。很多人学完语法还是不会用,关键在于缺少实战场景。下面通过一个真实小案例,让你彻底搞懂它们怎么配合工作。
你可以把委托理解为“方法的类型”。它定义了能指向哪些方法——就像变量保存数据,委托保存对方法的引用。
比如:假设我们有一个日志系统,想让不同模块都能接收日志消息,但又不想写死调用逻辑。这时候就可以用委托来“通知”谁来处理。
// 定义一个委托:能指向返回void,参数为string的方法 public delegate void LogHandler(string message);
然后我们可以创建这个委托的实例,指向具体的方法:
public class Logger
{
public static void WriteToConsole(string msg)
{
Console.WriteLine("控制台: " + msg);
}
public static void WriteToFile(string msg)
{
File.AppendAllText("log.txt", msg + "\n");
}
}使用委托调用:
LogHandler handler = Logger.WriteToConsole;
handler += Logger.WriteToFile; // 多播委托,可以挂多个方法
handler("程序启动了"); // 两个方法都会执行这样,调用方不需要知道具体怎么处理日志,只负责“发出”消息。
事件本质上是受保护的委托。它防止外部类随意触发或清空回调列表,只允许“注册(+=)”和“注销(-=)”。
继续上面的例子,我们做一个订单系统,当订单创建成功后,通知其他模块做相应操作——比如发邮件、记日志、更新库存等。
// 1. 定义委托
public delegate void OrderEventHandler(string orderId);
// 2. 创建订单服务类
public class OrderService
{
// 3. 声明事件
public event OrderEventHandler OnOrderCreated;
public void CreateOrder(string orderId)
{
// 模拟创建订单
Console.WriteLine($"订单 {orderId} 创建成功");
// 4. 触发事件(如果有人订阅)
OnOrderCreated?.Invoke(orderId);
}
}现在,其他模块可以订阅这个事件:
public class EmailService
{
public void SendConfirmationEmail(string orderId)
{
Console.WriteLine($"? 发送确认邮件:订单 {orderId}");
}
}
public class InventoryService
{
public void UpdateStock(string orderId)
{
Console.WriteLine($"? 更新库存:订单 {orderId}");
}
}主程序中连接它们:
class Program
{
static void Main()
{
var orderService = new OrderService();
var emailService = new EmailService();
var inventoryService = new InventoryService();
// 订阅事件
orderService.OnOrderCreated += emailService.SendConfirmationEmail;
orderService.OnOrderCreated += inventoryService.UpdateStock;
// 创建订单(自动触发事件)
orderService.CreateOrder("ORD-1001");
}
}输出结果:
订单 ORD-1001 创建成功 ? 发送确认邮件:订单 ORD-1001 ? 更新库存:订单 ORD-1001
这种设计的好处很明显:
这就是典型的松耦合设计,也是事件驱动编程的基础。
使用事件时注意这些细节:
OnEvent?.Invoke() 是安全写法)EventHandler<t></t> 泛型委托,更标准比如改写成标准形式:
public event EventHandler<string> OnOrderCreated; // 触发方式一样 OnOrderCreated?.Invoke(this, orderId);
基本上就这些。委托让你能“传递方法”,事件则提供了一种安全、规范的方式来实现“广播-监听”机制。掌握它们,你的代码会更灵活、更易扩展。
以上就是C#中的委托(Delegate)和事件(Event)怎么用?一个实战案例让你彻底明白的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号