C#中委托和事件的區(qū)別詳解
委托和事件的概念
委托
C# 中的委托(Delegate)類似于 C 或 C++ 中函數(shù)的指針。委托(Delegate) 是存有對某個方法的引用的一種引用類型變量。引用可在運行時被改變。它本質(zhì)上也是一個類。
它定義了方法的類型,使得可以將方法當作另一個方法的參數(shù)來進行傳遞,這種將方法動態(tài)地賦給參數(shù)的做法。
事件
事件由對象引發(fā),通過我們提供的代碼來處理。一個事件我們必須訂閱(Subscribe)他們,訂閱一個事件的含義就是提供代碼,在這個事件發(fā)生時執(zhí)行這些代碼,這些代碼稱為事件處理程序。
事件是在委托類型變量前加上 event 關(guān)鍵字,其本質(zhì)是用來對委托類型的變量進行封裝,類似于類的屬性對字段的封裝。
委托和事件的作用
委托
可以把方法當參數(shù)傳遞,可以避免在程序中大量使用 if-else(switch) 語句,同時使得程序具有更好的可擴展性。C#2.0 之后出現(xiàn)了 匿名函數(shù) 和 lambda表達式 也是 Delegate 演化而來。
事件
事件的使用一般通過發(fā)布者和訂閱者來進行。發(fā)布者會在某一條件下觸發(fā)某事件,訂閱者可以通過訂閱該事件,來對該事件的觸發(fā)做出反應(yīng)。
在設(shè)計模式中的訂閱者模式是最佳實踐。
委托和事件的區(qū)別
1、事件是委托的封裝 —— 是一種特殊的委托。(初學(xué)時已經(jīng)了解)
2、事件里面其實就是兩個方法(即 add_event() 和 remove_event())和一個私有的委托變量,這兩個方法里面分別是對這個私有的委托變量進行的合并和移除,當調(diào)用事件的 += 時其實是調(diào)用的事件里面的 add_event() 方法,同樣 -= 調(diào)用的是 remove_event() 方法。
3、在注冊和注銷事件上:
委托可以使用 = 和 += 來將函數(shù)注冊到委托的變量上,使用 -= 來將函數(shù)注銷。
事件則有著更嚴格的限制,事件只能使用 += 來將函數(shù)注冊到其上,使用 -= 來將函數(shù)注銷。
委托和事件代碼實踐
委托
“中國人和外國人問候” —— 經(jīng)典面試題
internal class Program { static void Main(string[] args) { CallDelegate("王二狗", SayChinese); CallDelegate("Tom", SayEnglish); } /// <summary> /// 聲明委托 /// </summary> /// <param name="name"></param> public delegate void DelegateSayHi(string name); /// <summary> /// 聲明委托調(diào)用方法 /// </summary> /// <param name="name"></param> /// <param name="sayHi"></param> public static void CallDelegate(string name, DelegateSayHi sayHi) => sayHi(name); /// <summary> /// 聲明實現(xiàn)方法 /// </summary> /// <param name="name"></param> public static void SayChinese(string name) { Console.WriteLine($"你好,{name}"); } /// <summary> /// 聲明實現(xiàn)方法 /// </summary> /// <param name="name"></param> public static void SayEnglish(string name) { Console.WriteLine($"Hello,{name}"); } }
事件
“貓叫、老鼠跑了,主人醒來了” —— 經(jīng)典面試題
internal class Program { static void Main(string[] args) { Mouse(); People(); Scream(); } /// <summary> /// 聲明委托 /// </summary> public delegate void DelegateScream(); /// <summary> /// 聲明事件 /// </summary> public static event DelegateScream OnScream; public static void Scream() { Console.WriteLine("貓叫了一聲"); OnScream?.Invoke(); } public static void Mouse() { OnScream += () => { Console.WriteLine("老鼠跑了"); }; } public static void People() { OnScream += () => { Console.WriteLine("主人醒了"); }; } }
總結(jié)
事件是一種特殊的委托,事件的最佳實踐為訂閱者模式。委托可以將函數(shù)作為參數(shù)傳遞,消除了很多不必要的判斷,增強了程序的健壯性和可擴展性。熟練并掌握委托和事件,有助我們寫出更優(yōu)雅、易讀且性能優(yōu)越的代碼。
到此這篇關(guān)于C#中委托和事件的區(qū)別詳解的文章就介紹到這了,更多相關(guān)C#委托 事件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#/VB.NET實現(xiàn)在Word中插入或刪除腳注
腳注,是可以附在文章頁面的最底端的,對某些東西加以說明,印在書頁下端的注文。這篇文章將為您展示如何通過C#/VB.NET代碼,以編程方式在Word中插入或刪除腳注,需要的可以參考一下2023-03-03unity scrollRect實現(xiàn)按頁碼翻頁效果
這篇文章主要為大家詳細介紹了unity scrollRect實現(xiàn)按頁碼翻頁效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-04-04C#請求http向網(wǎng)頁發(fā)送接收數(shù)據(jù)的方法
這篇文章主要為大家詳細介紹了C#請求http向網(wǎng)頁發(fā)送數(shù)據(jù)、網(wǎng)頁接收的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07C# 中屬性PropertyInfo的setvalue用法說明
這篇文章主要介紹了C# 中屬性PropertyInfo的setvalue用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01