浅谈C# 委托与事件

一、基本介绍

委托(Delegate)是一种特殊的类型,它定义了方法的类型,使得可以将方法作为参数传递。事件(Event)是基于委托的一种特殊用途,用于实现事件驱动的编程模型。

委托

委托可以看作是对方法的一种引用,它允许你将方法作为参数传递给其他方法。委托可以指向任何返回类型和参数列表与委托类型匹配的方法。

委托的声明
cs 复制代码
public delegate int Operation(int x, int y); // 声明一个委托,用于执行加法操作
委托的实例化和使用
cs 复制代码
public class Program
{
    public static void Main()
    {
        Operation op = new Operation(Add); // 实例化委托
        int result = op(5, 3); // 调用方法
        Console.WriteLine("结果是:{0}", result);

        op = new Operation(Subtract); // 改变委托引用的方法
        result = op(5, 3);
        Console.WriteLine("结果是:{0}", result);
    }

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

    public static int Subtract(int x, int y)
    {
        return x - y;
    }
}

事件

事件是一种特殊的多播委托,用于在对象间发布和订阅消息。事件的发布者(发布事件的对象)和订阅者(对事件感兴趣的对象)通过事件进行通信。

事件的声明
cs 复制代码
public class Publisher
{
    public event EventHandler OnChange; // 声明事件

    protected virtual void OnChangeEventHandler(EventArgs e)
    {
        OnChange?.Invoke(this, e);
    }

    public void Change()
    {
        // 触发事件
        OnChangeEventHandler(new EventArgs());
    }
}
事件的订阅和取消订阅
cs 复制代码
public class Subscriber
{
    public void Subscribe(Publisher publisher)
    {
        publisher.OnChange += OnChangeHandler; // 订阅事件
    }

    public void Unsubscribe(Publisher publisher)
    {
        publisher.OnChange -= OnChangeHandler; // 取消订阅事件
    }

    private void OnChangeHandler(object sender, EventArgs e)
    {
        Console.WriteLine("事件被触发!");
    }
}
使用事件
cs 复制代码
public class Program
{
    public static void Main()
    {
        Publisher publisher = new Publisher();
        Subscriber subscriber = new Subscriber();

        subscriber.Subscribe(publisher); // 订阅事件
        publisher.Change(); // 触发事件

        subscriber.Unsubscribe(publisher); // 取消订阅
        publisher.Change(); // 再次触发事件,但不会有输出
    }
}
相关推荐
2603_965148116 分钟前
电商选品调研:通过关键词搜索API获取市场热销商品,结合商品详情API分析竞品卖点与定价
开发语言·数据库·人工智能·python·信息可视化
xixiaoyunya1 小时前
Python 异步编程入门:用 asyncio 轻松实现并发任务
开发语言·python·php
学逆向的1 小时前
C 循环结构的执行效率分析
c语言·开发语言·数据结构·网络安全
小坏讲微服务1 小时前
刚发布一个月的JDK 27,为什么我建议你立刻升级?
java·开发语言·spring boot·spring·架构·求职招聘·springboot4
打工仔折腾 AI3 小时前
用 Dashlet 把极空间 NAS 服务入口整理成统一导航首页的实践
java·开发语言·人工智能·后端·python·rpc·ai agent 实战
MATLAB代码顾问3 小时前
Simulink PI 参数扫描与批量仿真完整 MATLAB 代码
开发语言·matlab
Want5953 小时前
Python跳动的爱心②
开发语言·python·数学建模
小羊没烦恼!4 小时前
T-SQL查询进阶--理解SQL SERVER中的分区表
服务器·开发语言·前端·javascript·html
爱吃香菜的初学者5 小时前
十六.Linux——多线程(2)
linux·运维·开发语言
jeo陽5 小时前
04-循环实战:素数、最大公约数、级数求和与枚举法
c语言·开发语言·数据结构