當前位置: 妍妍網 > 碼農

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#中非常重要的概念,它們使得程式碼更加靈活和可延伸。透過委托,我們可以將方法作為參數傳遞或賦值給變量,從而實作方法的動態呼叫。而回呼則允許一個方法在執行過程中呼叫另一個方法,通常用於異步操作和事件處理。在實際編程中,我們經常使用委托和回呼來實作異步編程、事件驅動編程和外掛程式式架構等。