C#基礎(chǔ)之委托詳解(Delegate)
C#中的委托(Delegate)是一種類(lèi)型安全的函數(shù)指針,用于封裝方法的引用。委托允許你將方法作為參數(shù)傳遞給其他方法,或者將方法存儲(chǔ)在變量中供后續(xù)調(diào)用。這種設(shè)計(jì)模式在事件處理、回調(diào)函數(shù)、異步編程等場(chǎng)景中尤為常用。
下面對(duì)C#委托進(jìn)行詳細(xì)解釋?zhuān)⑻峁┐a示例。
1. 委托定義
在C#中,定義一個(gè)委托類(lèi)型需要指定其參數(shù)類(lèi)型和返回類(lèi)型。
其語(yǔ)法形式如下:
public delegate 返回類(lèi)型 委托名(參數(shù)類(lèi)型 參數(shù)名[, ...]);
例如,定義一個(gè)接受兩個(gè)整數(shù)參數(shù)并返回一個(gè)整數(shù)的委托:
public delegate int MathOperation(int num1, int num2);
2. 委托實(shí)例化
要使用委托,首先需要?jiǎng)?chuàng)建一個(gè)委托實(shí)例,并將一個(gè)具有匹配簽名的方法賦值給它。
方法可以是靜態(tài)的、實(shí)例的,甚至可以是匿名方法或lambda表達(dá)式。
public static int Add(int a, int b) => a + b; public static int Subtract(int a, int b) => a - b; MathOperation addDelegate = new MathOperation(Add); MathOperation subtractDelegate = new MathOperation(Subtract);
或者使用C# 2.0引入的隱式類(lèi)型化:
MathOperation addDelegate = Add; MathOperation subtractDelegate = Subtract;
3. 多播委托(Multicast Delegates)
C#委托可以組合(+=)或分離(-=)其他委托實(shí)例,形成一個(gè)多播委托。
多播委托在調(diào)用時(shí)會(huì)依次執(zhí)行所有關(guān)聯(lián)方法。
這對(duì)于事件處理等場(chǎng)景特別有用,一個(gè)事件可以有多個(gè)訂閱者(處理器)。
MathOperation combinedDelegate = addDelegate + subtractDelegate; int result = combinedDelegate.Invoke(10, 5); // 先調(diào)用Add,后調(diào)用Subtract
4. 委托的用途
事件處理
C#中的事件就是一種特殊的委托類(lèi)型,用于實(shí)現(xiàn)發(fā)布-訂閱模式。
一個(gè)類(lèi)可以發(fā)布事件,其他類(lèi)可以訂閱這些事件并提供響應(yīng)方法。
當(dāng)事件觸發(fā)時(shí),所有訂閱者的方法會(huì)被依次調(diào)用。
public class Publisher
{
public event EventHandler<MyEventArgs> CustomEvent;
protected virtual void OnCustomEvent(MyEventArgs e)
{
CustomEvent?.Invoke(this, e);
}
public void TriggerEvent()
{
OnCustomEvent(new MyEventArgs("Event triggered"));
}
}
public class Subscriber
{
public void Subscribe(Publisher publisher)
{
publisher.CustomEvent += OnCustomEvent;
}
private void OnCustomEvent(object sender, MyEventArgs e)
{
Console.WriteLine($"Subscriber received event: {e.Message}");
}
}回調(diào)函數(shù)
委托可以用來(lái)封裝回調(diào)函數(shù),使得一個(gè)方法可以接受另一個(gè)方法作為參數(shù),待特定時(shí)機(jī)或條件滿(mǎn)足時(shí)調(diào)用。
public void PerformAsyncTask(Action<string> callback)
{
Task.Run(() =>
{
// 模擬耗時(shí)操作
Thread.Sleep(1000);
// 完成任務(wù)后通過(guò)回調(diào)通知結(jié)果
callback("Async task completed");
});
}
// 使用回調(diào)
PerformAsyncTask(result =>
{
Console.WriteLine($"Async task result: {result}");
});LINQ查詢(xún)
在LINQ(Language Integrated Query)中,委托如Func<T, TResult>和Action<T>被廣泛用于定義篩選、投影、聚合等操作。
var numbers = new[] { 1, 2, 3, 4, 5 };
// 使用Func<int, bool>作為謂詞篩選偶數(shù)
var evenNumbers = numbers.Where(n => n % 2 == 0);
// 使用Func<int, int, int>作為比較器排序
var sortedNumbers = numbers.OrderBy((a, b) => a.CompareTo(b));5. 委托與Lambda表達(dá)式
C# 3.0引入了lambda表達(dá)式,極大地簡(jiǎn)化了委托的使用。
Lambda表達(dá)式可以直接創(chuàng)建匿名方法,非常適合用于短小的委托定義。
MathOperation addLambda = (int a, int b) => a + b;
6. 委托與匿名方法
C# 2.0引入了匿名方法,可以在不創(chuàng)建單獨(dú)命名方法的情況下定義委托實(shí)例。
雖然lambda表達(dá)式現(xiàn)在更常用,但匿名方法在某些場(chǎng)景下仍有其價(jià)值。
MathOperation addAnonymous = delegate(int a, int b) { return a + b; };總結(jié)
起來(lái),C#委托是一種強(qiáng)大的語(yǔ)言特性,它使得方法可以作為參數(shù)傳遞,支持事件處理、回調(diào)、異步編程等多種編程模式。
通過(guò)與lambda表達(dá)式、匿名方法結(jié)合使用,可以更簡(jiǎn)潔、靈活地編寫(xiě)委托相關(guān)的代碼。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C#模擬實(shí)現(xiàn)鼠標(biāo)自動(dòng)點(diǎn)擊與消息發(fā)送功能
這篇文章主要為大家詳細(xì)介紹了C#如何利用windows api來(lái)模擬實(shí)現(xiàn)鼠標(biāo)點(diǎn)擊、右擊、雙擊以及發(fā)送文本功能,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-08-08
Unity屏幕雪花另類(lèi)實(shí)現(xiàn)方式示例
這篇文章主要介紹了Unity屏幕雪花另類(lèi)實(shí)現(xiàn)方式示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
C# Winform實(shí)現(xiàn)表格復(fù)制粘貼效果
這篇文章主要為大家學(xué)習(xí)介紹了如何通過(guò)C# Winform實(shí)現(xiàn)表格復(fù)制粘貼效果,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,需要的可以了解一下2023-07-07
Winform學(xué)生信息管理系統(tǒng)主頁(yè)面設(shè)計(jì)(2)
這篇文章主要為大家詳細(xì)介紹了Winform學(xué)生信息管理系統(tǒng)主頁(yè)面設(shè)計(jì)思路,感興趣的小伙伴們可以參考一下2016-05-05
C#利用StreamReader和StreamWriter類(lèi)處理文本的字符編碼使用示例
.NET Framework 中,StreamReader 和 StreamWriter 類(lèi)提供了一些方法來(lái)處理字符編碼,這篇文章主要介紹了C#利用StreamReader和StreamWriter類(lèi)處理文本的字符編碼使用示例,需要的朋友可以參考下2024-06-06

