1. 首先看一下以下兩個概念:
delegate:聲明定義一種引用類型,該類型可用於將方法用特定的簽名封裝。委託實例封裝靜態方法或實例方法。委託大致類似於 C++ 中的函數指針;但是,委託是類型安全和可靠的。
event:指定一個事件。在C#的類中存在以下成員:域(Fields)、屬性(Properties)、方法(Methods)、索引 (Indexs)、事件(Events),其中事件(Events)成員就是用來聲明一個類事件的。在類中聲明一個事件成員一般採用如下的語法形式:public event 委託名 事件名。
2.觀察者模式(Observer Pattern)
觀察者模式有兩個重要的對象:觀察主體和觀察者。每個觀察主體有一到多個觀察者。這些觀察者監聽來自觀察主題狀態變化的通知。觀察者模式也叫做依賴模式或發佈—訂閱模式。四人幫(Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides)在他們寫的《Design Patterns:Elements of Reusable Object-Oriented Software》書中提到觀察者模式可以應用在以下幾種場合:
一個抽象有兩個方面,這兩個方面彼此依賴。將這兩個方面封裝在不同的對象中,這樣你就可以獨立地修改和重用它們。
一個對象的改變需要改變其它對象,並且有多少對象需要隨之改變未知。
一個對象需要通知其它對象,但並不知道要通知哪些對象。換言之,你並不希望這些對象被緊緊地捆綁在一起。
事件通信時,事件發生者並不知道哪些對象或方法將收到市靜安發生的通知,它只是持有與簽名符合的方法的引用。代理相當於類項安全的函數指針或者回調。
以下爲代理來傳遞事件消息的例子。
3.通常C#自定義事件有下面的幾個步驟:
(1)聲明一個delegate: (用於事件的類型的定義)
public delegate void 事件名稱EventHandler(object serder, EventArgs e);
事件名稱用你自己的來代替,隨後的EventHandler是C#的建議命名規範,當然如果你不想遵守,可以使用任何字符甚至可以不要。
如果你想自定義事件的參數EventArgs,你可以從這個類派生你自己的事件參數類,然後在delegate的聲明中,用你的參數類替換EventArgs。
如下自定義事件的參數:
調用:
(2)在你的類中聲明一個事件,並且使用步驟1的delegate作爲事件的類型:
public event 事件名稱EventHandler 事件名稱;
(3)在你的類中需要觸發事件的方法中,添加事件觸發代碼:
事件名稱(this, new EventArgs());
或者:
if(事件名稱!=null)
事件名稱(this, new EventArgs());
如果使用你自己的事件參數類,你可以用你的參數類事例替換new EventArgs(), 同時在你的參數類中保存你需要傳遞的數據。
(4)C#自定義事件註冊:
事件註冊和普通的事件註冊沒有不同,也就是說如果一個外部的對象在你的事件被觸發的時候需要作出響應,那麼你可以在外部了構造器中(或者適當的地方)對事件進行註冊。
帶有事件的類實例.事件名稱+= new 事件名稱EventHandler( 事件處理方法名稱);
(5)編寫事件處理方法
public void 事件處理方法名稱(object sender, EventArgs e)
{
//添加你的代碼
}
注:如果你在類中處理自己的觸發事件,你可以選擇C#自定義事件步驟4和5的方式,也就是註冊自己,也可以在觸發事件代碼中直接調用事件處理方法。
4.完整例子: