当前位置: 首页 > news >正文

C#的委托delegate与事件event

在C#中,delegate(委托)和 event(事件)是两个非常重要的概念,它们主要用于实现回调机制和事件驱动编程。下面详细介绍它们的原理和使用场景。

1. Delegate(委托)
1.1 委托的原理
委托是一种类型,它定义了方法的签名(即方法的参数类型和返回类型)。

委托可以看作是一个函数指针,它允许将方法作为参数传递、存储和调用。

委托是类型安全的,编译器会检查委托和方法签名是否匹配。

委托可以绑定到一个或多个方法(多播委托)。

1.2 委托的声明与使用
声明委托

// 定义一个委托类型,它指向一个没有返回值且接受一个string参数的方法
public delegate void MyDelegate(string message);
使用委托
public class Program
{
    // 定义一个符合委托签名的方法
    public static void DisplayMessage(string message)
    {
        Console.WriteLine("Message: " + message);
    }

    public static void Main(string[] args)
    {
        // 创建委托实例并绑定方法
        MyDelegate myDelegate = new MyDelegate(DisplayMessage);

        // 调用委托
        myDelegate("Hello, Delegate!");
    }
}
多播委托

委托可以绑定多个方法,调用时会依次执行这些方法。

public class Program
{
    public static void DisplayMessage1(string message)
    {
        Console.WriteLine("Message 1: " + message);
    }

    public static void DisplayMessage2(string message)
    {
        Console.WriteLine("Message 2: " + message);
    }

    public static void Main(string[] args)
    {
        MyDelegate myDelegate = DisplayMessage1;
        myDelegate += DisplayMessage2; // 绑定第二个方法

        myDelegate("Hello, Multicast Delegate!");
    }
}

2. Event(事件)
2.1 事件的原理
事件是基于委托的,它是一种特殊的委托,用于实现发布-订阅模式。

事件的主要作用是限制委托的访问权限,确保外部代码只能订阅(+=)或取消订阅(-=)事件,而不能直接调用或覆盖事件。

事件通常用于实现观察者模式,例如 GUI 编程中的按钮点击事件。

2.2 事件的声明与使用
声明事件

// 定义一个委托类型
public delegate void MyEventHandler(object sender, EventArgs e);

// 定义一个包含事件的类
public class Button
{
    // 声明事件
    public event MyEventHandler Click;

    // 触发事件的方法
    public void OnClick()
    {
        if (Click != null) // 检查是否有订阅者
        {
            Click(this, EventArgs.Empty); // 触发事件
        }
    }
}

使用事件

public class Program
{
    public static void Main(string[] args)
    {
        Button button = new Button();

        // 订阅事件
        button.Click += Button_Click;

        // 模拟按钮点击
        button.OnClick();
    }

    // 事件处理方法
    private static void Button_Click(object sender, EventArgs e)
    {
        Console.WriteLine("Button clicked!");
    }
}

3. 委托与事件的区别
特性    委托 (Delegate)    事件 (Event)
访问权限    可以从外部直接调用或覆盖    只能从声明它的类内部触发
多播支持    支持多播(绑定多个方法)    支持多播(绑定多个事件处理方法)
用途    通用回调机制,方法传递    实现发布-订阅模式,事件驱动编程
安全性    较低,外部代码可以随意修改委托    较高,外部代码只能订阅或取消订阅事件
4. 使用场景
4.1 委托的使用场景
回调机制:将方法作为参数传递给其他方法,例如异步编程中的回调。

多播委托:需要依次调用多个方法的场景,例如日志记录系统。

动态方法调用:在运行时决定调用哪个方法。

示例:异步编程中的回调

public delegate void AsyncCallback(int result);

public class Calculator
{
    public void AddAsync(int a, int b, AsyncCallback callback)
    {
        Task.Run(() =>
        {
            int result = a + b;
            callback(result); // 异步完成后调用回调
        });
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        Calculator calculator = new Calculator();
        calculator.AddAsync(10, 20, result => Console.WriteLine("Result: " + result));
    }
}

4.2 事件的使用场景
GUI 编程:例如按钮点击、鼠标移动等事件。

发布-订阅模式:例如消息队列、通知系统。

解耦:将事件的触发者和处理者解耦,提高代码的可维护性。

示例:GUI 中的按钮点击事件

public class Button
{
    public event EventHandler Click;

    public void OnClick()
    {
        Click?.Invoke(this, EventArgs.Empty);
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        Button button = new Button();
        button.Click += (sender, e) => Console.WriteLine("Button clicked!");

        button.OnClick();
    }
}

5. 总结
委托:用于定义方法签名,支持多播,适合实现回调机制。

事件:基于委托,用于实现发布-订阅模式,适合解耦和事件驱动编程。

在实际开发中,事件是委托的一种高级应用,通常用于需要更高安全性和解耦的场景。

相关文章:

  • es6的Generator函数用法
  • 【Git】reflog实战:找回丢失的提交
  • USB2.03.0接口区分usb top工具使用
  • uniapp 打包安卓 集成高德地图
  • C#功能测试
  • Redis日志分析
  • 序列化和反序列化
  • Git从基础到进阶
  • 2025.2.17——1400
  • CHARMM-GUI EnzyDocker: 一个基于网络的用于酶中多个反应状态的蛋白质 - 配体对接的计算平台
  • 【Leetcode 热题 100】1287. 有序数组中出现次数超过25%的元素
  • 利用雪花算法+Redis 自增 ID,生成订单号
  • java练习(28)
  • Java 大视界 -- 开源社区对 Java 大数据发展的推动与贡献(91)
  • AWS 前端自动化部署流程指南
  • Leetcode 526 Beautiful number
  • 用自己的数据训练yolov11目标检测
  • HTTP 响应头信息
  • Selenium+Pytest自动化测试框架实战
  • ad原理图元件透明问题
  • “抵沪第一杯咖啡”送进虹桥机场到达层,刚下飞机就能免费喝
  • “阳光下的守护”法治公安主题宣传活动在京启动:突出为民服务宣传
  • 菲律宾华人“钢铁大王”撕票案两主谋被捕,部分赎金已被提取
  • 中信银行资产管理业务中心原副总裁罗金辉一审被控受贿超4437万
  • A股高开高走:宠物经济走强,超3800股收涨,两市成交超1.1万亿元
  • 李根读《野兽之魂》|拨开高深的布幔,直窥历史的复杂