导读:本期聚焦于小伙伴创作的《.NET中委托和事件有什么区别?怎么正确使用委托与事件?》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《.NET中委托和事件有什么区别?怎么正确使用委托与事件?》有用,将其分享出去将是对创作者最好的鼓励。

在.NET程序里,委托(Delegate)和事件(Event)经常一起出现,但它们扮演的角色并不相同。委托是一种类型安全的函数引用类型,事件则是建立在委托之上的发布订阅机制。理解二者差异,能让我们写出更松耦合、易维护的代码。

.NET中委托和事件有什么区别?怎么正确使用委托与事件?

什么是委托

委托可以看作指向方法的变量。它定义了方法签名,任何符合该签名的方法都能赋值给委托实例。下面的代码展示了一个简单委托的声明与调用:

// 定义委托类型,接收两个int参数并返回int
public delegate int Calc(int a, int b);

class Program
{
    static int Add(int x, int y)
    {
        return x + y;
    }

    static void Main()
    {
        // 创建委托实例并绑定方法
        Calc calc = new Calc(Add);
        int result = calc(3, 5);
        System.Console.WriteLine(result);
    }
}

多播委托

一个委托变量可以绑定多个方法,这称为多播委托。调用时会按顺序执行所有方法:

public delegate void Notify(string msg);

class Demo
{
    static void A(string s) { System.Console.WriteLine("A:" + s); }
    static void B(string s) { System.Console.WriteLine("B:" + s); }

    static void Main()
    {
        Notify n = A;
        n += B;   // 追加方法
        n("hello");
    }
}

事件是对委托的封装

事件使用 event 关键字基于委托声明,限制外部只能订阅或取消订阅,不能直接触发或覆盖委托链。这保护了发布者的控制权。

public class Publisher
{
    // 基于委托定义事件
    public event Notify OnMessage;

    public void Send(string msg)
    {
        // 只有类内部可以触发
        if (OnMessage != null)
            OnMessage(msg);
    }
}

class Client
{
    static void Handler(string s)
    {
        System.Console.WriteLine("收到:" + s);
    }

    static void Main()
    {
        Publisher p = new Publisher();
        p.OnMessage += Handler;  // 外部订阅
        p.Send("test");
    }
}

委托与事件的选择

如果只是需要把方法当参数传递,或组件内部自己管理回调,用委托即可。若要实现对象间的通知且希望禁止外部随意触发,应使用事件。常见场景如下:

  • 按钮点击、状态变更等UI通知:使用事件
  • 策略模式传入算法:使用委托
  • 异步完成回调:可用委托或事件

注意事项

使用事件时注意内存泄漏风险,长期订阅未取消可能导致对象无法回收。另外,触发事件前务必判空,或使用空条件运算符:

// 安全触发事件
OnMessage?.Invoke("safe");

掌握这些基础后,就能在.NET项目中合理运用委托和事件,写出清晰且可扩展的逻辑。

DelegateEvent事件订阅修改时间:2026-07-29 03:18:19

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。