C#基础之回调机制详解,让代码动起来的关键技巧

在这里插入图片描述

前言

大家好,欢迎关注dotnet研习社,今天我们聊聊 C# 中一个很基础但又非常实用的概念 —— 回调机制

相信很多小伙伴刚入门编程的时候,听到“回调”这个词会感觉有点抽象,好像是个挺高级的玩意儿。其实,回调的本质非常简单,它就是 把一个方法当作参数传给另一个方法,并在合适的时机调用它

什么是回调?

直白地说,回调就是 “反过来调用”。通常我们写方法时,都是主动去调用别人写的方法。而回调则是,我们把自己的一段方法交给别人,等到适当的时候,对方再“反过来”调用我们的方法。

这个机制在 异步编程事件驱动模块解耦 等场景中极其有用。

C# 中的回调实现方式

在 C# 里,回调主要通过三种方式实现:

  1. 委托(Delegate)
  2. 匿名方法(Anonymous Method)
  3. 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# 的小伙伴们~😉

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dotnet研习社

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值