C# 委托回调Callback
				
									
					
					
						 | 
						
							
							admin 
							
							
								2024年1月26日 8:36
								本文热度 1402
							
							 
						 | 
					
					
				 
				在C#编程中,委托(Delegate)和回调(Callback)是两个重要的概念,它们经常一起使用,以实现事件驱动编程和异步操作。委托本质上是一个类型安全的函数指针,它允许将方法作为参数传递或赋值给变量。而回调则是一种机制,允许一个方法在执行过程中调用另一个方法,通常用于在异步操作完成后通知调用者。
一、委托(Delegate)
委托是一种类型,它定义了方法的签名(即方法的返回类型和参数列表)。一旦定义了委托,就可以将与其签名匹配的方法赋值给该委托的实例。委托可以用于实现事件和回调机制。
委托的声明:
public delegate int MyDelegate(int x, int y);
委托的使用:
public class Calculator
{
    public int Add(int x, int y)
    {
        return x + y;
    }
}
// ...
Calculator calc = new Calculator();
MyDelegate myDelegate = new MyDelegate(calc.Add);
int result = myDelegate(5, 3); // 调用委托,相当于调用calc.Add(5, 3)
二、回调(Callback)
回调是一种编程模式,其中一个方法(通常是异步方法)在执行过程中调用另一个方法。回调通常用于在异步操作完成后通知调用者。在C#中,回调通常通过委托实现。
回调的示例:
假设我们有一个异步方法DownloadFile,它需要一个回调方法来在下载完成后执行某些操作。
public delegate void DownloadCompletedHandler(string fileName, bool success);
public class FileDownloader
{
    public event DownloadCompletedHandler DownloadCompleted;
    public void DownloadFile(string url, string savePath)
    {
        // 模拟异步下载过程
        Task.Run(() =>
        {
            bool success = DownloadFileImpl(url, savePath); // 假设这是一个实际下载文件的方法
            DownloadCompleted?.Invoke(savePath, success); // 下载完成后触发回调
        });
    }
}
// ...
FileDownloader downloader = new FileDownloader();
downloader.DownloadCompleted += (fileName, success) =>
{
    if (success)
    {
        Console.WriteLine($"文件下载成功:{fileName}");
    }
    else
    {
        Console.WriteLine($"文件下载失败:{fileName}");
    }
};
downloader.DownloadFile("http://example.com/file.txt", "file.txt");
三、总结
委托和回调是C#中非常重要的概念,它们使得代码更加灵活和可扩展。通过委托,我们可以将方法作为参数传递或赋值给变量,从而实现方法的动态调用。而回调则允许一个方法在执行过程中调用另一个方法,通常用于异步操作和事件处理。在实际编程中,我们经常使用委托和回调来实现异步编程、事件驱动编程和插件式架构等。
该文章在 2024/2/7 18:43:18 编辑过