全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

委托是C#中类型安全的函数指针,用于封装方法引用以实现回调、事件处理及多播调用;支持自定义声明(如delegate void MessageHandler(string))和内置泛型委托(如Action、Func、Predicate)。

在 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 事件如按钮点击、窗口关闭等都依赖于委托。

定义事件通常使用 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#  # red  # gate  # 架构  # Static  # String  # NULL  # if  # foreach  # 封装  # 字符串  # bool  # int  # void  # Lambda  # 指针  # class  # public  # Length  # Delegate  # 委托  # Event  # 泛型  # var  # console  # 事件  # this  # 异步  # ui  # 回调  # 返回值  # 自定义  # 完成后  # 的是  # 是一个  # 是一种  # 多个  # 是指  # 数据处理 


相关文章: 网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?  如何通过FTP服务器快速搭建网站?  如何用IIS7快速搭建并优化网站站点?  网站建设设计制作营销公司南阳,如何策划设计和建设网站?  公司网站的制作公司,企业网站制作基本流程有哪些?  北京的网站制作公司有哪些,哪个视频网站最好?  c# 服务器GC和工作站GC的区别和设置  江苏网站制作公司有哪些,江苏书法考级官方网站?  如何注册花生壳免费域名并搭建个人网站?  IOS倒计时设置UIButton标题title的抖动问题  c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗  Python路径拼接规范_跨平台处理说明【指导】  网站制作免费,什么网站能看正片电影?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  巅云智能建站系统:可视化拖拽+多端适配+免费模板一键生成  如何在阿里云虚拟主机上快速搭建个人网站?  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  如何优化Golang Web性能_Golang HTTP服务器性能提升方法  如何快速启动建站代理加盟业务?  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  公众号网站制作网页,微信公众号怎么制作?  定制建站模板如何实现SEO优化与智能系统配置?18字教程  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  建站之星如何快速更换网站模板?  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  广州网站建站公司选择指南:建站流程与SEO优化关键词解析  太原网站制作公司有哪些,网约车营运证查询官网?  建站主机默认首页配置指南:核心功能与访问路径优化  如何快速建站并高效导出源代码?  如何制作一个表白网站视频,关于勇敢表白的小标题?  建站之星代理费用多少?最新价格详情介绍  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  制作网页的网站有哪些,电脑上怎么做网页?  建站主机核心功能解析:服务器选择与网站搭建流程指南  简历在线制作网站免费,免费下载个人简历的网站是哪些?  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  如何用PHP快速搭建高效网站?分步指南  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  建站之星如何取消后台验证码生成?  网站企业制作流程,用什么语言做企业网站比较好?  义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?  linux top下的 minerd 木马清除方法  无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?  长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?  如何用低价快速搭建高质量网站?  开心动漫网站制作软件下载,十分开心动画为何停播?  如何通过二级域名建站提升品牌影响力?  寿县云建站:智能SEO优化与多行业模板快速上线指南  如何获取开源自助建站系统免费下载链接? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。