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

C# 中的回调函数

在 C# 中,“回调函数”(Callback Function)这一概念主要是通过**委托(Delegate)**来实现的。委托是 C# 的核心特性之一,它使得代码具有极大的灵活性和可扩展性。


C# 中的回调函数(Callback Function)

1. 什么是回调函数?

回调函数本质上就是一个作为参数传递给另一个函数的函数

  • 调用方(Caller):是接收这个函数作为参数,并在内部某个时刻执行(调用)它的那个函数或方法。
  • 回调函数(Callback):就是那个被传递进去并等待被执行的函数。

核心思想: 允许一个较低级别的函数(或类)在完成某个操作时,通知或执行由较高级别函数(或类)提供的特定操作。这实现了控制的反转

2. C# 如何实现回调?—— 委托(Delegate)

在 C# 中,**委托(Delegate)**是实现回调机制的“基石”或“函数指针”。

a. 委托的定义

委托是一种类型安全的函数指针,它定义了一个方法的签名(包括返回类型和参数列表)。

示例代码:定义一个委托

// 1. 定义委托
// 想象它是一个“合同”,规定了回调函数的签名:
// 必须接收一个 string 参数,并返回 void。
public delegate void PrintMessage(string message);
b. 回调函数的实现(订阅者)

回调函数是遵循委托签名要求的任何方法。

示例代码:实现回调函数

public class Subscriber
{// 这是一个符合 PrintMessage 委托签名的方法public void DisplayInfo(string info){Console.WriteLine($"[信息]:{info}");}// 另一个符合 PrintMessage 委托签名的方法public static void LogError(string error){Console.WriteLine($"[错误日志]:{error} (来自静态方法)");}
}
c. 调用方的设计(发布者)

调用方(执行回调的函数)需要接收一个委托实例作为参数。

示例代码:调用方

public class Caller
{// 核心方法:它接收一个委托(即回调函数的引用)作为参数public void ProcessTask(string data, PrintMessage callbackFunc){Console.WriteLine("---- 开始处理任务 ----");if (string.IsNullOrEmpty(data)){// 在特定条件(数据为空)下,调用方执行回调函数// 注意:这里调用的是 LogErrorcallbackFunc.Invoke("数据输入为空,无法继续!");}else{// 在特定条件(处理成功)下,调用方执行回调函数// 注意:这里调用的是 DisplayInfocallbackFunc.Invoke($"成功处理数据:{data.ToUpper()}");}Console.WriteLine("---- 任务处理结束 ----");}
}
d. 使用和调用

在主程序中,创建委托实例,并将其传递给调用方。

示例代码:主程序调用

public class Program
{public static void Main(){Subscriber sub = new Subscriber();Caller caller = new Caller();// **步骤 1: 将回调函数(方法)绑定到委托实例**// 创建委托实例,指向 Subscriber 实例的 DisplayInfo 方法PrintMessage displayCallback = sub.DisplayInfo;// **步骤 2: 将委托(回调的引用)传递给调用方**Console.WriteLine("--- 第一次调用(正常数据)---");caller.ProcessTask("hello world", displayCallback);// 输出将由 DisplayInfo 方法格式化Console.WriteLine("\n--- 第二次调用(空数据)---");// 也可以直接在调用时创建并传递委托实例caller.ProcessTask("", sub.DisplayInfo); // 也可以使用不同的回调函数(例如静态方法 LogError)Console.WriteLine("\n--- 第三次调用(使用 LogError)---");caller.ProcessTask("Another Data", Subscriber.LogError);}
}

3. 简化方式:Func、Action 和 Lambda 表达式

在现代 C# 中,为了避免每次都定义新的委托类型,我们通常使用内置的泛型委托:

  • Action:用于没有返回值的回调函数(最多支持 16 个参数)。
  • Func<TResult>:用于有返回值的回调函数(TResult 是返回类型,前面的参数是输入参数)。

同时,Lambda 表达式(匿名函数)使得回调函数的定义更加简洁:

使用 Func 和 Lambda 的示例:

public void CalculateAndReport(int num1, int num2, Func<int, int, int> calculationLogic)
{// calculationLogic 是一个回调函数,接收两个 int,返回一个 intint result = calculationLogic.Invoke(num1, num2);Console.WriteLine($"计算结果是: {result}");
}public static void Main()
{// 传递一个 Lambda 表达式作为回调函数(执行加法)CalculateAndReport(10, 5, (a, b) => a + b); // 输出: 15// 传递另一个 Lambda 表达式作为回调函数(执行乘法)CalculateAndReport(10, 5, (x, y) => x * y); // 输出: 50
}

4. 回调的应用场景

回调机制在 C# 中有着广泛的应用,尤其是在以下场景:

场景描述C# 实现方式
事件处理当特定事件(如按钮点击、文件下载完成)发生时,通知并执行订阅者的方法。事件(Event),它本质上是委托的特殊封装。
异步操作在 I/O 操作(如网络请求、文件读写)完成时,执行后续处理逻辑。Taskawait/async(底层也依赖回调机制)。
自定义逻辑允许用户向通用算法(如排序、过滤)中注入自定义的比较或筛选逻辑。List<T>.Sort() 接收一个 Comparison<T> 委托(即回调)。
插件机制设计框架时,预留接口让外部模块在特定时机执行其功能。委托或接口。

总结来说,在 C# 中,委托是回调函数机制的官方实现,它提供了一种灵活、类型安全的方式,来将代码的执行权从一个函数(调用方)传递给另一个函数(回调函数)。

http://www.dtcms.com/a/470708.html

相关文章:

  • 海南网站公司苏州吴中区住房和城乡建设局网站
  • SwiftUI 的状态管理包装器(Property Wrapper)
  • MATLAB基于WOA(鲸鱼优化算法)优化LSTM神经网络的分类模型实现。主要功能是通过智能算法自动寻找LSTM的最佳超参数,构建分类模型并对数据进行分类预测
  • Ethernet II 帧头部
  • 【完整源码+数据集+部署教程】 植物组织分割系统源码&数据集分享 [yolov8-seg-LSKNet等50+全套改进创新点发刊_一键训练教程_Web前端展示
  • 网站链接怎么做二维码诸暨网站制作有哪些公司
  • 大连网站制作网页asp网站经常 响应
  • 引航科技提供网站建设建设网站的分析
  • 【笔记】poll,实现I/O多路复用的一种机制,是 select 的改进版
  • 智能风控-银行卡实名认证接口-银行卡实名API助力企业高效合规管理
  • Java基础面试题
  • 网站建站建设费用新任上海市领导调整公示
  • 泰安市网站建设公司合肥制作网站企业
  • chrome插件开发_chrome扩展程序开发
  • GraphQL 初学者指南
  • 天津网站建设推荐安徽秒搜科技深圳高端人力资源公司
  • 图片生成网站大连工业大学继续教育学院
  • 国外时尚设计网站展台展览
  • 用 Python 打造一个 Telegram 二手交易商城机器人
  • 广胜达建设集团网站百度上首页
  • 网站显示域名武进网站建设哪家好
  • 建立一个网站wordpress 网站备案
  • 怎么做网站图标做一个flash网站多少钱
  • MobaXterm部署项目到云服务器
  • CTF攻防世界WEB精选基础入门:command_execution
  • 正在加载类,静态数据…
  • Python语言基础入门:从零开始掌握Python编程
  • Dioxus hot-dog 总结
  • 罗湖网站 建设深圳信科学编程入门
  • 大语言模型出现幻觉的本质