C#基礎(chǔ)之委托詳解(Delegate)
C#中的委托(Delegate)是一種類型安全的函數(shù)指針,用于封裝方法的引用。委托允許你將方法作為參數(shù)傳遞給其他方法,或者將方法存儲在變量中供后續(xù)調(diào)用。這種設(shè)計(jì)模式在事件處理、回調(diào)函數(shù)、異步編程等場景中尤為常用。
下面對C#委托進(jìn)行詳細(xì)解釋,并提供代碼示例。
1. 委托定義
在C#中,定義一個(gè)委托類型需要指定其參數(shù)類型和返回類型。
其語法形式如下:
public delegate 返回類型 委托名(參數(shù)類型 參數(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引入的隱式類型化:
MathOperation addDelegate = Add; MathOperation subtractDelegate = Subtract;
3. 多播委托(Multicast Delegates)
C#委托可以組合(+=)或分離(-=)其他委托實(shí)例,形成一個(gè)多播委托。
多播委托在調(diào)用時(shí)會(huì)依次執(zhí)行所有關(guān)聯(lián)方法。
這對于事件處理等場景特別有用,一個(gè)事件可以有多個(gè)訂閱者(處理器)。
MathOperation combinedDelegate = addDelegate + subtractDelegate; int result = combinedDelegate.Invoke(10, 5); // 先調(diào)用Add,后調(diào)用Subtract
4. 委托的用途
事件處理
C#中的事件就是一種特殊的委托類型,用于實(shí)現(xiàn)發(fā)布-訂閱模式。
一個(gè)類可以發(fā)布事件,其他類可以訂閱這些事件并提供響應(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ù)
委托可以用來封裝回調(diào)函數(shù),使得一個(gè)方法可以接受另一個(gè)方法作為參數(shù),待特定時(shí)機(jī)或條件滿足時(shí)調(diào)用。
public void PerformAsyncTask(Action<string> callback) { Task.Run(() => { // 模擬耗時(shí)操作 Thread.Sleep(1000); // 完成任務(wù)后通過回調(diào)通知結(jié)果 callback("Async task completed"); }); } // 使用回調(diào) PerformAsyncTask(result => { Console.WriteLine($"Async task result: {result}"); });
LINQ查詢
在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á)式,極大地簡化了委托的使用。
Lambda表達(dá)式可以直接創(chuàng)建匿名方法,非常適合用于短小的委托定義。
MathOperation addLambda = (int a, int b) => a + b;
6. 委托與匿名方法
C# 2.0引入了匿名方法,可以在不創(chuàng)建單獨(dú)命名方法的情況下定義委托實(shí)例。
雖然lambda表達(dá)式現(xiàn)在更常用,但匿名方法在某些場景下仍有其價(jià)值。
MathOperation addAnonymous = delegate(int a, int b) { return a + b; };
總結(jié)
起來,C#委托是一種強(qiáng)大的語言特性,它使得方法可以作為參數(shù)傳遞,支持事件處理、回調(diào)、異步編程等多種編程模式。
通過與lambda表達(dá)式、匿名方法結(jié)合使用,可以更簡潔、靈活地編寫委托相關(guān)的代碼。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C# WinForm調(diào)用Shell_NotifyIcon的示例代碼
這篇文章主要介紹了C# WinForm調(diào)用Shell_NotifyIcon的示例代碼,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下2020-11-11詳解如何獲取C#類中發(fā)生數(shù)據(jù)變化的屬性信息
這篇文章主要介紹了詳解如何獲取C#類中發(fā)生數(shù)據(jù)變化的屬性信息,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05C#使用HttpClient進(jìn)行Post請求出現(xiàn)超時(shí)問題的解決及優(yōu)化
最近我的控制臺程序發(fā)現(xiàn)有時(shí)候總是出現(xiàn)請求超時(shí)等問題,通常好幾分鐘最多只有3-4個(gè)請求,在使用apipost發(fā)現(xiàn)并發(fā)10個(gè)5分鐘也沒有問題,那么問題就出在我的請求端了,所以本文給大家介紹了C# 使用HttpClient進(jìn)行Post請求總是出現(xiàn)超時(shí)問題的優(yōu)化,需要的朋友可以參考下2025-01-01C#對二進(jìn)制數(shù)據(jù)進(jìn)行base64編碼的方法
這篇文章主要介紹了C#對二進(jìn)制數(shù)據(jù)進(jìn)行base64編碼的方法,涉及C#中Convert.ToBase64String用法技巧,需要的朋友可以參考下2015-04-04