前言
大家好,欢迎关注dotnet研习社,今天我们聊聊 C# 中一个很基础但又非常实用的概念 —— 回调机制。
相信很多小伙伴刚入门编程的时候,听到“回调”这个词会感觉有点抽象,好像是个挺高级的玩意儿。其实,回调的本质非常简单,它就是 把一个方法当作参数传给另一个方法,并在合适的时机调用它。
什么是回调?
直白地说,回调就是 “反过来调用”。通常我们写方法时,都是主动去调用别人写的方法。而回调则是,我们把自己的一段方法交给别人,等到适当的时候,对方再“反过来”调用我们的方法。
这个机制在 异步编程、事件驱动、模块解耦 等场景中极其有用。
C# 中的回调实现方式
在 C# 里,回调主要通过三种方式实现:
- 委托(Delegate)
- 匿名方法(Anonymous Method)
- Lambda 表达式
我们一步步来看。
示例讲解
1️⃣ 使用委托实现回调
先来看一个最基础的委托示例:
using System;
namespace CallbackDemo
{
// 定义一个委托类型
public delegate void NotifyCallback(string message);
class Program
{
static void Main(string[] args)
{
// 调用方法并传入回调
ProcessTask(TaskCompleted);
Console.ReadLine();
}
// 需要被回调的方法
static void TaskCompleted(string msg)
{
Console.WriteLine("回调方法被调用了: " + msg);
}
// 处理任务的方法,接收回调作为参数
static void ProcessTask(NotifyCallback callback)
{
Console.WriteLine("正在处理任务...");
// 模拟任务处理
System.Threading.Thread.Sleep(1000);
// 任务完成,执行回调
callback("任务已经完成!");
}
}
}
2️⃣ 使用匿名方法实现回调
C# 2.0 之后,支持 匿名方法,可以省去额外定义一个方法名的步骤:
static void Main(string[] args)
{
ProcessTask(delegate (string msg)
{
Console.WriteLine("匿名方法回调: " + msg);
});
Console.ReadLine();
}
3️⃣ 使用 Lambda 表达式实现回调
到了 C# 3.0,Lambda 表达式 进一步简化写法,现代 C# 编码中几乎标配:
static void Main(string[] args)
{
ProcessTask((msg) => Console.WriteLine("Lambda回调: " + msg));
Console.ReadLine();
}
回调机制的实际应用场景
讲到这里,可能有小伙伴会问:“实际项目中回调到底用在哪儿?”
别急,我帮大家整理几个非常典型的实际场景👇
📌 1. 异步操作完成后的通知
比如文件下载、网络请求:
void DownloadFile(string url, Action<string> onComplete)
{
Console.WriteLine("正在下载文件...");
// 假设异步下载
System.Threading.Thread.Sleep(1000);
onComplete("下载完成: " + url);
}
// 调用
DownloadFile("http://example.com/file", (msg) => Console.WriteLine(msg));
📌 2. 事件监听机制
比如 WinForm/WPF/ASP.NET 中按钮点击事件,本质上就是回调机制。
button.Click += (sender, e) =>
{
Console.WriteLine("按钮被点击,执行回调!");
};
📌 3. 自定义排序(传入比较回调)
List<T>.Sort()
方法就可以传入自定义比较器回调:
List<int> numbers = new List<int> { 5, 2, 8, 1 };
numbers.Sort((a, b) => a.CompareTo(b)); // 升序
numbers.ForEach(n => Console.WriteLine(n));
📌 4. 策略模式实现
不同策略以回调形式传入,动态切换行为:
void ExecuteStrategy(Action strategy)
{
Console.WriteLine("开始执行策略...");
strategy();
}
// 调用
ExecuteStrategy(() => Console.WriteLine("当前策略:导出到Excel"));
ExecuteStrategy(() => Console.WriteLine("当前策略:导出到PDF"));
📌 5. 解耦业务模块
比如日志模块,允许外部注入回调自定义日志处理方式:
class Logger
{
public Action<string> LogCallback { get; set; }
public void Log(string msg)
{
LogCallback?.Invoke(msg);
}
}
// 使用
Logger logger = new Logger();
logger.LogCallback = (msg) => Console.WriteLine("写日志: " + msg);
logger.Log("系统启动完成");
小结
今天,我们围绕 C# 的回调机制,重点聊了它的核心概念和几种实现方式:
- 什么是回调
- 委托 + 匿名方法 + Lambda 三种实现方法
- 真实开发中常见的应用场景
相信看完本文后,你对回调机制的理解一定更加清晰。
回调是构建灵活、可扩展架构的重要一环,尤其在异步编程、事件驱动、解耦模块设计中必不可少。
🚀 思考题
你在项目中有没有遇到过需要用回调机制的场景?你更喜欢用哪种方式实现?欢迎评论区一起交流讨论!
如果觉得本文对你有帮助,别忘了点赞收藏,也欢迎分享给你身边正在学 C# 的小伙伴们~😉