學習和理解C 中的事件

2021-08-02 15:00:23 字數 2490 閱讀 6169

注:本文系學習筆記。

class lesson}}

//響鈴private

void ringbell(int remaintime) 分鐘,請同學們最好上課準備。",remaintime

); }

//螢幕顯示準備上課

private

void displaylesson(int remaintime) 分鐘。

",remaintime);

}}class program

}

上面的**很清楚,能夠達到我們想要實現的效果。但是這樣寫並不好,假設學校期中考試期間,為了不打擾考試的考試,要求不能響鈴,而考試結束後恢復響鈴,這時候我們處理起來就比較麻煩。又或者我們的lesson這個類表示課前準備工作,是表示上課前30分鐘,我們學生完成的一些事情(假設還有其他事情,比如複習上節課內容,預習新知識等等)。把響鈴和螢幕顯示上課時間放在這個類裡就會有點奇怪。根據物件導向原則,我們應該把響鈴和螢幕顯示單獨放在各自的乙個類裡。**修改如下:

public

class lesson

}}public

class bell 分鐘,請同學們最好上課準備。",remaintime);

}}public class display 分鐘。",remaintime);      } }

這樣就可以了,但是現在,如何讓在距離上課時間不到5分鐘的時候,響鈴和螢幕顯示準備上課呢。這裡用到observer設計模式。這裡簡單舉個例子說明observer設計模式,中國移動有提供每月話費賬單、流量賬單之類的查詢業務。但是並不是每個人都需要它推送這樣的訊息。有的人可能不需要查詢,有的人可能只關心話費賬單,有的人可能只關心流量問題,有的人可能兩者都需要。那麼移動公司具體是如何為每個人提供他所需要的服務呢?當然是根據使用者訂閱的種類,使用者關心的什麼,就傳送什麼。observer設計模式與此類似,它包含兩類物件。

subject:監視物件,它包含著其他物件所感興趣的內容。在本範例中,上課就是乙個監視物件,它包含的其他物件所感興趣的內容,就是remaintime欄位,當這個欄位的值小於等於5時,會不斷把資料發給監視它的物件。

observer:監視者,它監視subject,當subject中的某件事發生的時候,會告知observer,而observer則會採取相應的行動。在本範例中,observer有鈴鐺和螢幕顯示器,它們採取的行動分別是響鈴和顯示上課準備。

observer設計模式:observer設計模式是為了定義物件間的一種一對多的依賴關係,以便於當乙個物件的狀態改變時,其他依賴於它的物件會被自動告知並更新。observer模式是一種松耦合的設計模式。

下面繼續修改**

上例可見,事件實際上就是乙個委託。

public

class lesson}}

}}public

class bell 分鐘,請同學們最好上課準備。

",remaintime);

}}public

class display 分鐘。

",remaintime);

}}class program

}

那麼事件跟委託有什麼區別呢,上篇文章介紹了,委託必須初始化之後才能新增繫結的方法,而上面的**我們可以看到直接給事件新增繫結方法。這是因為事件是乙個封裝了的委託,.net框架實際上在編譯的時候已經為時間做了初始化。上面事件的用法與我們見到的.net中的事件形式上不同,實際上.net framework中的事件模型是規範化了的,.net事件的編碼規範如下

那麼我們繼續修改我們的**,讓它遵循規範

class lesson

}protected

virtual

void onprepare(prepareeventargs e)

}public

void preparelesson()}}

public

class bell 分鐘,請同學們最好上課準備。",e.remaintime

); }

}public

class display 分鐘。",e.remaintime

); }

}class program

}

最後總結一下:c#中的事件處理實際上是一種具有特殊簽名的delegate,它是將委託進行封裝,不允許直接方位委託本身,只能通過給委託新增和移除繫結的方法。(+=、-=實際上是呼叫了add 和 remove方法)像下面這個樣子:

public delegate void myeventhandler(object sender, myeventargs e);

其中的兩個引數,sender代表事件傳送者,e是事件引數類。myeventargs類用來包含與事件相關的資料,所有的事件引數類都必須從system.eventargs類派生。當然,如果你的事件不含引數,那麼可以直接用system.eventargs類作為引數。

就是這麼簡單,結合delegate的實現,我們可以將自定義事件的實現歸結為以下幾步:

理解C 中的委託和事件

csdn論壇,由於對方也是 所以源作者不詳 有許多人問的,net中的委託以及事件處理。我拿簡單的例子說明一下,是現實中的例子。比如說 乙個公司 場景 你是老闆,手下有兩個員工,小張和小王。你命令小王,如果小張玩遊戲,則小王扣去小張500元錢。這就是現實中的委託。實際上,在寫程式中,程式設計師就是老闆...

理解C 中的委託和事件

一直不甚至理解c 中委託和事件的概念和用法,在網上參看數篇文字之後略有所得,好記性不如爛鍵盤,故以文字記下。首先,設想乙個簡單場景 或許不太貼切 來說明,夜深人靜,屋裡有老鼠躡手躡腳的行動,且隨時提防著貓,如果聽到貓叫,老鼠聞聲立即逃回洞裡。這個場景可以抽象為委託和事件的幾個要素 貓和老鼠分別是兩個...

C 委託和事件的理解

委託 private delegate string getastring 委託的定義,使用delegate關鍵字 兩種指向方法的寫法 getastring a new getastring x.tostring a指向了x中的tostring方法 getastring a x.tostring 兩...