当前位置: 欣欣网 > 码农

C# 委托回调Callback

2024-02-07码农

在C#编程中,委托(Delegate)和回调(Callback)是两个重要的概念,它们经常一起使用,以实现事件驱动编程和异步操作。委托本质上是一个类型安全的函数指针,它允许将方法作为参数传递或赋值给变量。而回调则是一种机制,允许一个方法在执行过程中调用另一个方法,通常用于在异步操作完成后通知调用者。

一、委托(Delegate)

委托是一种类型,它定义了方法的签名(即方法的返回类型和参数列表)。一旦定义了委托,就可以将与其签名匹配的方法赋值给该委托的实例。委托可以用于实现事件和回调机制。

委托的声明

publicdelegateintMyDelegate(int x, int y);

委托的使用

public classCalculator
{
publicintAdd(int x, int y)
{
return x + y;
}
}
// ...
Calculator calc = new Calculator();
MyDelegate myDelegate = new MyDelegate(calc.Add);
int result = myDelegate(53); // 调用委托,相当于调用calc.Add(5, 3)

二、回调(Callback)

回调是一种编程模式,其中一个方法(通常是异步方法)在执行过程中调用另一个方法。回调通常用于在异步操作完成后通知调用者。在C#中,回调通常通过委托实现。

回调的示例

假设我们有一个异步方法 DownloadFile ,它需要一个回调方法来在下载完成后执行某些操作。

publicdelegatevoidDownloadCompletedHandler(string fileName, bool success);
public classFileDownloader
{
publicevent DownloadCompletedHandler DownloadCompleted;
publicvoidDownloadFile(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#中非常重要的概念,它们使得代码更加灵活和可扩展。通过委托,我们可以将方法作为参数传递或赋值给变量,从而实现方法的动态调用。而回调则允许一个方法在执行过程中调用另一个方法,通常用于异步操作和事件处理。在实际编程中,我们经常使用委托和回调来实现异步编程、事件驱动编程和插件式架构等。