委託訂閱了這個事件,觀察者
例項化,圖紙
delegate
delegate是c#中的一種型別,它實際上是乙個能夠持有對某個方法的引用的類。與其它的類不同,delegate類能夠擁有乙個簽名(signature),並且它"只能持有與它的簽名相匹配的方法的引用"。
實現乙個delegate是很簡單的,通過以下3個步驟即可實現乙個delegate:
1. 宣告乙個delegate物件,它應當與你想要傳遞的方法具有相同的引數和返回值型別。
2. 建立delegate物件,並"將你想要傳遞的函式作為引數傳入"。
3. 在要實現非同步呼叫的地方,通過上一步建立的物件來呼叫方法。
using system;
public
class
mydelegatetest
public
static
void
main()
}輸出結果是:hello, sam1111
了解了delegate,下面我們來看看,在c#中對事件是如何處理的。
c#中的事件處理實際上是一種具有特殊簽名的delegate,象下面這個樣子:
public delegate void myeventhandler(object sender, myeventargs e);
其中的兩個引數,sender代表事件傳送者,e是事件引數類。myeventargs類用來包含與事件相關的資料,所有的事件引數類都必須從system.eventargs類派生。當然,如果你的事件不含引數,那麼可以直接用system.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}}
輸出結果如下,紅色為使用者的輸入:
please input 『a』: a
myevent
is ok!
C 實現的委託機制(一)
c 實現的委託機制 一 1.引言 下面的委託實現使用的mygui裡面的委託實現,mygui是一款強大的gui庫,想理解更多的mygui資訊,猛擊這裡 我們的目標是要實現乙個跟.net幾乎完全一樣的委託,使用簡單,支援多播,可以新增刪除委託。同時支援c 的普通函式 模板函式 類成員函式,類的靜態成員函...
C 鍊錶的操作(一),如何建立乙個鍊錶
鍊錶是一種常見的重要的資料結構,它是動態的進行記憶體儲存分配的一種結構。用陣列存放資料時,必須事先定義固定的長度 即元素個數 但是事先難以確定有多少個元素時,則必須把陣列定義的足夠大,以保證成功。無疑,這會造成記憶體浪費,然而,鍊錶則沒有這種缺點,它可以根據需要,動態開闢記憶體單元。鍊錶中的各個元素...
c 用委託和事件實現不同窗體間的通訊 一
c 中的 事件 是當物件滿足一定條件,發生某些事情時,類向該類的客戶提供通知的一種方法。使用事件,擁有該事件的物件不必知道需要通知誰,一旦滿足了某個條件,將自動呼叫該事件,正確通知每個需要通知的物件。通過使用事件,提高了程式的模組化程度。例子 通過form1開啟form2,改變form2上combo...