商城網(wǎng)站開發(fā)視頻東莞網(wǎng)站建設(shè)排名
使用事件
事件是一個(gè)動(dòng)作或發(fā)生的事情,例如:鼠標(biāo)點(diǎn)擊、按鍵、鼠標(biāo)移動(dòng)或系統(tǒng)產(chǎn)生的通知。應(yīng)用程序可以在事件發(fā)生的時(shí)候做出響應(yīng)。通知的一個(gè)示例是中斷。事件是對(duì)象發(fā)生的消息以表示事件的發(fā)生。事件是進(jìn)程內(nèi)通信的有效方法。它們對(duì)對(duì)象時(shí)有用的,因?yàn)樗鼈儤?biāo)識(shí)了單個(gè)狀態(tài)改變,可能對(duì)對(duì)象的客戶端有價(jià)值。
考慮事件的示例。時(shí)鐘是一個(gè)對(duì)象,它顯示早上6點(diǎn)的時(shí)間,以鬧鐘的形式產(chǎn)生一個(gè)事件。您接受鬧鈴事件并且做出相應(yīng)的動(dòng)作。
下圖顯示了鬧鈴事件及對(duì)其的處理。
下圖是一個(gè)泛化表示,它解釋了事件和事件處理。
在C#中,委托與事件一起使用以實(shí)現(xiàn)事件處理。.NET Framework事件模型使用委托來將事件通知與方法綁定,稱為事件處理程序。當(dāng)事件產(chǎn)生的時(shí)候,委托調(diào)用相關(guān)事件處理程序??紤]一個(gè)網(wǎng)球視頻游戲的場景。游戲玩家一用球拍擊球就會(huì)生成一個(gè)事件?,F(xiàn)在根據(jù)球拍的位置,委托將為事件選擇事件處理程序。如果球拍的位置在玩家的右邊,會(huì)產(chǎn)生將球發(fā)到場地左邊的方法。當(dāng)用戶生成擊球事件時(shí),會(huì)動(dòng)態(tài)確定以特定方法發(fā)球。
將委托用于事件
事件是在類中聲明和產(chǎn)生的??墒褂梦性谙嗤惢蚱渌愔袑⑺鼈兣c事件處理程序相關(guān)聯(lián)。事件是類的一部分,這個(gè)類用于發(fā)布事件。但是,其他類可以接受這些事件,或者換句話說,可以訂閱這些事件。事件使用發(fā)布者和訂閱者模型。
發(fā)布者是一個(gè)包含事件和委托定義的對(duì)象。事件與委托的關(guān)聯(lián)還在發(fā)布者類中指定。發(fā)布者的對(duì)象調(diào)用事件,它被通知給其他對(duì)象。
訂閱者是要接受事件并為事件提供處理程序的對(duì)象。發(fā)布者類的委托調(diào)用訂閱者類的方法。這個(gè)在訂閱者類中的方法時(shí)事件處理程序。發(fā)布者和訂閱者模型的實(shí)現(xiàn)可以由相同類定義。
下圖顯示了發(fā)布者和訂閱者對(duì)象使用的機(jī)制。
事件的實(shí)現(xiàn)包括事件定義、事件訂閱和事件通知。
定義事件
在發(fā)布者類中事件的定義包括委托的聲明和基于委托的事件的聲明。
下面的代碼定義了一個(gè)名為TimeToRise的委托和一個(gè)名為RingAlarm的事件,當(dāng)它被引發(fā)時(shí),調(diào)用TimeToRise委托:
public delegate void TimeToRise();private event TimeToRise RingAlarm;
訂閱事件
發(fā)布者類事件需要與它的處理程序關(guān)聯(lián)。事件處理程序方法時(shí)使用委托與事件關(guān)聯(lián)的。當(dāng)發(fā)布者對(duì)象產(chǎn)生事件的時(shí)候,訂閱對(duì)象與需要調(diào)用的方法關(guān)聯(lián)。
考慮名為Student的類,它包含一個(gè)名為WakeUp()的方法。要求是應(yīng)在上午6點(diǎn)調(diào)用W