C#中的委託和事件對於新手可能會有一點難理解,因此先從一個小例子入手,以便能更好的理解其如何使用。有一個學生天天定鬧鐘在早上6點起牀,因此當天天早上6點的時候,鬧鐘就會響起來,從而學生纔會按時起牀。編程
上面例子實際上包括2個類,一個是學生類(Student),一個是鬧鐘類(Ring)。此時,讓咱們仔細想一想,當鬧鐘到點後如何通知學生呢?固然不要說,鬧鐘響了,學生能聽到這樣的話23333,如今是寫程序,一切用程序說話。也就是說當時間到了,鬧鐘類裏應該有個給學生髮消息的方法(OnSendMessage()),學生類裏會有處理這個消息方法(HandleEvent()),好比提及牀。看似蠻對的,可是有一個問題,這不是實時通訊程序,學生如何檢測到鬧鐘發來的信息,從而去調用起牀的方法呢?實際在程序中,咱們是經過在鬧鐘類的發消息方法中調用學生類中的起牀方法實現的。是否是有點亂了?那換句話說,就是當響鈴這一事件被觸發後,起牀會自動發生。呃,不當心就把事件給說出來了,感受本身有點囉嗦了。spa
那什麼是委託,委託實際上是一種編程技術,事件機制是委託這種技術的應用。簡單的說,經過在聲明個委託delegate,將HandleEvent()方法交給delegate,這樣在鬧鐘類中就能夠經過委託調用HandleEvent()方法了。code
到這裏有的朋友可能讀懵了。不用擔憂,不懂能夠先繼續往下看。說下委託和事件各自的聲明格式:blog
委託:[修飾符] delegate 返回類型 委託名(參數列表)
舉例:事件
public delegate void RingHandler();
事件:[修飾符] event 委託名 事件名
string
舉例:it
public event RingHandler SendMessage;
根據上面的小例子,咱們把代碼實現,而後你們細細體會。event
一、須要聲明一個委託class
public delegate void RingHandler();
須要注意2點,委託的聲明在類外與類的聲明並列。委託的返回類型和參數列表必須與須要被委託方法(HandleEvent())的返回類型和參數列表相同。程序
二、建立一個定義事件的類,即消息的發送方(Ring)。須要包含(1)與委託關聯的事件(2)事件的觸發方法
1 public delegate void RingHandler();//注意返回類型和參數列表與事件處理方法返回類型和參數列表一致 2 public class Ring 3 { 4 public event RingHandler SendMessage;//與委託關聯的事件,此時不懂不要緊,知道是個事件就行。 5 public void OnSendMessage()//事件觸發時調用的方法 6 { 7 SendMessage(); 8 } 9 }
三、定義一個將方法鏈接到接收事件的上的類(Student)。須要包含(1)事件處理方法(2)將事件與事件處理方法相關聯
public class Student { public void HandleEvent()//事件處理方法 { Console.WriteLine("該起牀了"); } public void Register(Ring ring) { ring.SendMessage += new RingHandler(HandleEvent);//此處注意事件註冊或移除只能用+=/-=符號,不能用其餘。括號裏只需寫上方法名便可 } }
最後建立實例使程序運行,代碼以下:
class Program { static void Main(string[] args) { Ring ring = new Ring(); Student student = new Student(); student.Register(ring); if(GetTime() == 6)//若是時間是6點,就觸發響鈴方法。GetTime()不給實現了。 { ring.OnSendMessage(); } } }
總結一下,事件的使用簡單就是三點:(1)定義事件(2)註冊事件(3)觸發事件。大概就是這樣使用的,可是在實際工做中,一般咱們只須要完成事件處理方法中的代碼,沒必要關心事件和委託的定義。