事件(event),這個詞兒對於初學者來說,往往總是顯得有些神秘,不易弄懂。而這些東西卻往往又是程式設計中常用且非常重要的東西。大家都知道windows訊息處理機制的重要,其實c#事件就是基於windows訊息處理機制的,只是封裝的更好,讓開發者無須知道底層的訊息處理機制,就可以開發出強大的基於事件的應用程式來。
在以往我們編寫這類程式中,往往採用等待機制,為了等待某件事情的發生,需要不斷地檢測某些判斷變數,而引入事件程式設計後,大大簡化了這種過程:
- 使用事件,可以很方便地確定程式執行順序。
- 當事件驅動程式等待事件時,它不占用很多資源。事件驅動程式與過程式程式最大的不同就在於,程式不再不停地檢查輸入裝置,而是呆著不動,等待訊息的到來,每個輸入的訊息會被排進佇列,等待程式處理它。如果沒有訊息在等待,則程式會把控制交回給作業系統,以執行其他程式。
- 事件簡化了程式設計。作業系統只是簡單地將訊息傳送給物件,由物件的事件驅動程式確定事件的處理方法。作業系統不必知道程式的內部工作機制,只是需要知道如何與物件進行對話,也就是如何傳遞訊息。
有了這麼多好處,看來我們的確有必要掌握它。俗話說:「難了不會,會了不難」。讓我們一步一步開始吧
要講事件,必然要講到委託(delegate)。它們之間的關係可以通過乙個淺顯的比方來說明,這個比方可能不是十分恰當。比如你要租乙個房屋,這是乙個事件,那麼委託就是房屋租賃中介,當你把租房子的訊息告知中介後,中介就會產生出一套符合你要求的房屋租賃方案來。再由中介執行這套方案,你便租得了這個房屋,即事件被處理了。當然你也可以不通過中介,直接找房東,但如果沒有網際網路等工具,你如何得到誰出租房屋的資訊?話題扯遠了。
委託(delegate)
委託可以理解成為函式指標,不同的是委託是物件導向,而且是型別安全的。關於委託這裡不再多說了。
事件(event)
我們可以把事件程式設計簡單地分成兩個部分:事件發生的類(書上叫事件發生器)和事件接收處理的類。事件發生的類就是說在這個類中觸發了乙個事件,但這個類並不知道哪個物件或方法將會收到並處理它觸發的事件。所需要的是在傳送方和接收方之間存在乙個媒介。這個媒介在中就是委託(delegate)。在事件接收處理的類中,我們需要有乙個處理事件的方法。
c#中的事件處理實際上是一種具有特殊簽名的delegate,一般象下面這個樣子:
public delegate void myeventhandler(object sender, myeventargs e);
其中第乙個引數(sender)代表事件傳送者,指明了觸發該事件的物件,第二個引數(e)是事件引數類,包含了在事件處理函式中可以被運用的一些資料。當然,如果你的事件不含引數,那麼可以直接用system.eventargs類作為引數,或者可以不使用引數。myeventargs類用來包含與事件相關的資料,所有的事件引數類都必須從system.eventargs類派生。這裡的myeventargs類是從eventargs類繼承過來的,後者是一些更廣泛運用的類,如mouseeventargs類、listchangedeventargs類等的基類。
msdn:eventargs是包含事件資料的類的基類,此類不包含事件資料,在事件引發時不向事件處理程式傳遞狀態資訊的事件會使用此類。如果事件處理程式需要狀態資訊,則應用程式必須從此類派生乙個類來儲存資料。
就是這麼簡單,結合delegate的實現,我們可以將自定義事件的實現歸結為以下幾步:
1.定義delegate物件型別,它有兩個引數,第乙個引數是事件傳送者物件,第二個引數是事件引數類物件。
2.定義事件引數類,此類應當從system.eventargs類派生。如果事件不帶引數,這一步可以省略。
3.定義"事件處理方法,它應當與delegate物件具有相同的引數和返回值型別"。
4.用event關鍵字定義事件物件,它同時也是乙個delegate物件。
5.用+=操作符新增事件到事件佇列中(-=操作符能夠將事件從佇列中刪除)。
6.在需要觸發事件的地方用呼叫delegate的方式寫事件觸發方法。一般來說,此方法應為protected訪問限制,既不能以public方式呼叫,但可以被子類繼承。名字是oneventname。
7. 在適當的地方呼叫事件觸發方法觸發事件。
using system;
public class eventtest
}// 步驟4,用event關鍵字定義事件物件
private event myeventhandler myevent;
private myeventcls myecls;
public eventtest()
// 步驟6,以呼叫delegate的方式寫事件觸發函式
protected void onmyevent(system.eventargs e)
public void raiseevent()
public static void main()
else}}
C 事件 事件學習好例子
一 委託的簡介 二 事件的簡介 三 委託和事件的使用 四 總結 一 委託的簡介 1 委託的宣告 delegate handlername parameters 例如 public delegate void printhandler string str 委託宣告定義了一種型別,它用一組特定的引數以...
js 事件 事件物件
關於事件寫了一系列文章 1.事件流 事件捕獲和事件冒泡 2.事件處理程式 3.事件物件 本文介紹事件物件 4.通用的事件偵聽器函式 5.事件迴圈 event loop 6.事件 event delegation 1.事件物件 觸發dom上的某個物件時,會產生乙個事件物件event dom0級事件物件...
事件 事件流理解
當我們給元素繫結好單擊事件,單擊這個元素,就會執行相應的 但是如果這個元素的父元素 祖先元素都繫結了單擊事件,他們會執行嗎?他們的執行順序是什麼呢?可以嘗試把頁面理解為乙個二維的平面,想象有一張白紙,我們在這張紙上畫下了一層一層的同心圓,當我們用手指按住最內的圓圈時,也按住了紙上所有的同心圓,也按住...