全网整合营销服务商

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

免费咨询热线: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  # 回调  # 返回值  # 自定义  # 完成后  # 的是  # 是一个  # 是一种  # 多个  # 是指  # 数据处理 


相关文章: ,石家庄四十八中学官网?  C#如何使用XPathNavigator高效查询XML  如何在局域网内绑定自建网站域名?  如何选择高效便捷的WAP商城建站系统?  如何在阿里云ECS服务器部署织梦CMS网站?  建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析  专业商城网站制作公司有哪些,pi商城官网是哪个?  成都响应式网站开发,dw怎么把手机适应页面变成网页?  如何快速生成凡客建站的专业级图册?  深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?  如何在阿里云高效完成企业建站全流程?  制作农业网站的软件,比较好的农业网站推荐一下?  寿县云建站:智能SEO优化与多行业模板快速上线指南  c# 在高并发下使用反射发射(Reflection.Emit)的性能  建站之星安装需要哪些步骤及注意事项?  山东网站制作公司有哪些,山东大源集团官网?  制作旅游网站html,怎样注册旅游网站?  如何在IIS中新建站点并配置端口与物理路径?  ,怎么在广州志愿者网站注册?  上海网站制作开发公司,上海买房比较好的网站有哪些?  如何用y主机助手快速搭建网站?  建站主机选购指南:核心配置与性价比推荐解析  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  专业网站制作服务公司,有哪些网站可以免费发布招聘信息?  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  如何在云服务器上快速搭建个人网站?  音乐网站服务器如何优化API响应速度?  如何在Windows环境下新建FTP站点并设置权限?  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  如何登录建站主机?访问步骤全解析  武清网站制作公司,天津武清个人营业执照注销查询系统网站?  微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?  青岛网站建设如何选择本地服务器?  如何优化Golang Web性能_Golang HTTP服务器性能提升方法  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  创业网站制作流程,创业网站可靠吗?  C++如何将C风格字符串(char*)转换为std::string?(代码示例)  娃派WAP自助建站:免费模板+移动优化,快速打造专业网站  ,网页ppt怎么弄成自己的ppt?  ,怎么用自己头像做动态表情包?  ,制作一个手机app网站要多少钱?  网站制作话术技巧,网站推广做的好怎么话术?  如何选择靠谱的建站公司加盟品牌?  西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?  枣阳网站制作,阳新火车站打的到仙岛湖多少钱?  C#怎么使用委托和事件 C# delegate与event编程方法  道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  如何用AWS免费套餐快速搭建高效网站?  建站之星在线客服如何快速接入解答? 

您的项目需求

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