C# 委托(delegate)的用法 - 实现回调函数与事件处理的核心

煙雲
发布: 2025-12-05 14:19:12
原创
911人浏览过
委托是C#中类型安全的函数指针,用于封装方法引用以实现回调、事件处理及多播调用;支持自定义声明(如delegate void MessageHandler(string))和内置泛型委托(如Action、Func、Predicate)。

c# 委托(delegate)的用法 - 实现回调函数与事件处理的核心

在 C# 中,委托(delegate)是一种类型安全的函数指针,它允许将方法作为参数传递、在运行时动态调用,是实现回调机制和事件处理的基础。通过委托,可以编写更灵活、可扩展的代码,尤其在 GUI 编程、异步操作和事件驱动架构中广泛使用。

什么是委托

委托是一个类,用于封装对具有特定参数列表和返回类型的方法的引用。声明委托后,可以将方法赋值给该委托实例,并通过委托来调用这个方法。

定义委托使用 delegate 关键字,例如:

public delegate void MessageHandler(string message);
public delegate int Calculate(int a, int b);

上述代码定义了两个委托:MessageHandler 指向无返回值、接受一个字符串参数的方法;Calculate 指向返回 int、接受两个 int 参数的方法。

使用委托实现回调函数

回调函数是指在一个方法执行完成后,调用另一个预先指定的方法。委托非常适合实现这种机制。

例如,有一个数据处理方法,在处理完成后需要通知调用方:

public class DataProcessor
{
    public void ProcessData(string data, MessageHandler callback)
    {
        // 模拟处理
        Console.WriteLine("正在处理数据...");
        if (callback != null)
            callback("处理完成!");
    }
}

// 使用示例
static void ShowMessage(string msg)
{
    Console.WriteLine(msg);
}

var processor = new DataProcessor();
processor.ProcessData("test", ShowMessage);

这里 ShowMessage 方法被当作回调传入,处理完成后由委托触发,实现了调用方与处理逻辑的解耦。

委托在事件处理中的应用

C# 的事件(event)本质上是基于委托的封装,用于实现发布-订阅模式。常见的 UI 事件如按钮点击、窗口关闭等都依赖于委托。

Riffo
Riffo

Riffo是一个免费的文件智能命名和管理工具

Riffo 216
查看详情 Riffo

定义事件通常使用 EventHandler 或自定义委托:

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

    // 触发事件
    public void OnClick()
    {
        Click?.Invoke(this, EventArgs.Empty);
    }
}

// 使用
var button = new Button();
button.Click += (sender, e) => Console.WriteLine("按钮被点击了!");
button.OnClick();

通过 += 可以注册多个事件处理器,当事件触发时,所有订阅的方法都会被调用。这正是委托多播(MulticastDelegate)能力的体现。

内置委托类型简化开发

C# 提供了一些通用委托类型,减少手动声明委托的需要:

  • Action:表示无返回值的方法,支持 0 到 16 个参数,如 Action、Action、Action
  • Func:表示有返回值的方法,最后一个泛型参数为返回类型,如 Func、Func
  • Predicate:表示返回 bool 的方法,常用于条件判断,如 Predicate

例如:

List names = new List { "Alice", "Bob", "Charlie" };
names.FindAll(name => name.Length > 4).ForEach(Console.WriteLine);

这里的 FindAll 接收的是 Predicate,而 Lambda 表达式自动匹配到该委托类型。

基本上就这些。委托是 C# 实现回调和事件的核心机制,理解其用法有助于掌握事件驱动编程和异步模型。结合 Lambda 表达式和内置泛型委托,可以让代码更简洁、更具表达力。

以上就是C# 委托(delegate)的用法 - 实现回调函数与事件处理的核心的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号