.NET中委托(Delegate)和事件(Event)的用法_委托事件使用详解

委托是类型安全的函数指针,可引用方法并支持多播调用;事件基于委托,用于封装发布-订阅模式,限制外部直接调用,确保安全的通知机制。

.net中委托(delegate)和事件(event)的用法_委托事件使用详解

在 .NET 中,委托(Delegate事件(Event) 是实现回调机制和松耦合设计的重要工具。它们广泛应用于异步编程、GUI 交互、观察者模式等场景。理解它们的用法和区别,对编写高质量的 C# 程序非常关键。

什么是委托(Delegate)?

委托是一种类型安全的函数指针,它定义了方法的签名(参数和返回值),可以引用一个或多个具有相同签名的方法。委托允许将方法作为参数传递,也可以在运行时动态绑定方法。

声明委托:

public delegate void MyDelegate(string message);

这行代码定义了一个名为 MyDelegate 的委托,它可以指向任何返回值为 void、参数为 string 的方法。

使用委托示例:

public class Logger
{
    public void LogToConsole(string msg) => Console.WriteLine(“Console: ” + msg);
    public void LogToFile(string msg) => File.AppendAllText(“log.txt”, msg + “n”);
}

// 使用
MyDelegate del = new Logger().LogToConsole;
del += new Logger().LogToFile;
del(“程序启动”); // 两个方法都会执行

上述代码中,委托实例 del 同时绑定了两个方法,调用时会依次执行,这就是多播委托(Multicast Delegate)

事件(Event)是什么?

事件是基于委托的封装,用于实现发布-订阅模式。事件允许一个类在特定动作发生时通知其他类,而无需知道具体是谁在监听。

事件通常用于对象间的通信,比如按钮点击、数据更新等。

声明事件:

public class Button
{
    // 声明事件
    public event MyDelegate Click;

    // 触发事件
    public void OnClick()
    {
        if (Click != null)
            Click(“按钮被点击”);
    }
}

订阅事件:

Button btn = new Button();
btn.Click += new Logger().LogToConsole;
btn.Click += new Logger().LogToFile;
btn.OnClick(); // 触发事件,两个日志方法都会执行

事件的关键点在于:外部类可以使用 +=-= 订阅或取消订阅,但不能直接调用事件或赋值为 null(除非在声明类内部)。

委托与事件的区别

虽然事件基于委托,但两者有本质区别:

封装性:事件是对委托的封装,限制外部直接触发或清空委托链。访问控制:类外部只能订阅或取消订阅事件,不能像委托那样随意调用或赋值。语义清晰:事件表示“某事发生了”,更适合用于消息通知;委托更偏向于“调用某个方法”。线程安全考虑:触发事件时应先复制引用,避免在多线程下引发异常:var handler = Click;
if (handler != null)
    handler(“事件触发”);

常见应用场景

实际开发中,委托和事件非常实用:

窗体应用:WinForms 或 WPF 中的按钮点击、文本变更等都通过事件实现。跨页面通信:父控件监听子控件状态变化。异步回调:任务完成后的通知处理。自定义通知机制:如订单创建后通知库存、邮件服务等模块。

使用 EventHandler 或泛型 EventHandler 是更标准的做法:

public class OrderEventArgs : EventArgs
{
    public string OrderId { get; set; }
}

public class OrderService
{
    public event EventHandler OrderCreated;

    protected virtual void OnOrderCreated(string orderId)
    {
        OrderCreated?.Invoke(this, new OrderEventArgs { OrderId = orderId });
    }

    public void CreateOrder()
    {
        // 创建订单逻辑…
        OnOrderCreated(“SO001”);
    }
}

基本上就这些。掌握委托和事件,能让你写出更灵活、可扩展的代码。关键是理解它们的协作方式:委托提供调用能力,事件提供安全的通知机制。

以上就是.NET中委托(Delegate)和事件(Event)的用法_委托事件使用详解的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1442073.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 18:42:18
下一篇 2025年12月17日 18:42:36

相关推荐

发表回复

登录后才能评论
关注微信