委託事件入門
阿新 • • 發佈:2018-11-30
作者:王俊傑
連結:https://www.zhihu.com/question/21638630/answer/32794112
來源:知乎
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
有這麼一個故事吧!
附上原始碼:
using System; namespace 起床事件 { class 主程式 { static void Main(string[] args) { /* 專案場景描述: * 我從明天早上開始要早起晨讀,室友每天都七點起床晨跑,我告訴他明天起來的時候把我叫醒,並讓我晨讀 * PS:還有個王八犢子非要跟我賭五毛我起不來,還讓明天室友也叫他,見證我到底有沒有起來 */ //首先你們三個得存在吧 var 中國好室友 = new 室友(); var 我 = new 要晨讀的我(); var 王八犢子 = new 王八犢子(); //我先告訴室友:我要早起晨讀 中國好室友.叫別人起床該幹嘛幹嘛 += 我.起床晨讀; //王八犢子來攪屎了 中國好室友.叫別人起床該幹嘛幹嘛 += 王八犢子.賭五毛起不來; //於是第二天到了 Console.WriteLine("鬧鈴:早上七點鐘..."); Console.WriteLine("系統提示:室友起床了!"); Console.WriteLine(); 中國好室友.起床晨跑去(); Console.WriteLine(); Console.WriteLine("==========全劇終=========="); Console.ReadLine(); } public delegate void 這是一個委託(); public class 室友 { public void 起床晨跑去() { Console.WriteLine("室友:喂,起床啦!"); Console.WriteLine(""); if (叫別人起床該幹嘛幹嘛 != null) //如果有人委託我什麼 { 叫別人起床該幹嘛幹嘛(); } Console.WriteLine("室友:完事走人,晨跑去!"); } public event 這是一個委託 叫別人起床該幹嘛幹嘛; } public class 要晨讀的我 { public void 起床晨讀() { Console.WriteLine("我:哦,起來了!!!"); Console.WriteLine("我:一二三四五,上網看知乎,刷完知乎再晨讀!"); Console.WriteLine(); } } public class 王八犢子 { public void 賭五毛起不來() { Console.WriteLine("王八犢子:五毛拿走,勞資要碎覺!"); Console.WriteLine(); } } } }
覺得這樣直接貼程式碼,不做解釋的話,可能還令人不太理解,再補充下概念。
方法:具體去做什麼事實際內容,可以是早讀,晨跑,或者是叫別人起床。
委託:將方法當做值。就像整數型值3能賦給一個int型別的變數,方法可以賦值給相同引數的委託型別變數。通過關鍵字delegate定義。
事件:一個需要先定義的委託型別和關鍵字event來定義。具體就是可以承載方法。
事件的用法:不講編譯器幫我們做的正規使用方法,因為我自己也不太清楚。直接用語法糖,事件變數 += 需要掛接的方法.然後就是在內部處理,何時去觸發這個事件了 事件變數() ,當然其形參的定義就看委託型別的定義了,亦可以將事件變數裡面的掛接的方法逐個處理,這就等理解事件
PS:可能我理解的有些誤區,但管他呢我知道這麼用能完成我的需求。原理什麼的想知道的話看書去啦!
如果你用過C/C++ 的函式指標,那麼跟你說委託就是函式指標,事件就是儲存多個函式指標的陣列就夠了。