事件與委託

2022-01-11 00:43:31 字數 2751 閱讀 7795

網上有好多講委託與事件的文章,寫得都很不錯,以下是我對事件與委託的理解,若有不當之處,請提出,萬分感謝。

為了方便閱讀,我將**寫在了後面,前面介紹了一些跟**有關的資訊。

observe模式中,主體subject指受監控者,觀察者observer指監控者。記憶體狀態(memerystatus)是受監控者,屬於主體;observer是監控者,屬於觀察者;

主體中往往有乙個或多個觀察者感興趣的資訊,此例中式currentvolume,即當前記憶體容量,主體中還應該有定義好的事件,主體中的事件在客戶端(一般指含有main函式的類)與觀察者中的處理方法繫結,當主體滿足某一條件時(此例中指滿足currentvolume>95時),就應該激發事件(此例中指memeryobserve(this, args);),之後,與該事件繫結的所有觀察者端的處理方法都會執行(這叫**),這樣,通過事件,將主體端的狀態變化和觀察者端的監控相關聯,主體變化,觀察者就能做出相應變化了。

換種方式看本例程式,其實很熟悉,開啟vs新建乙個c# winform應用程式,在預設窗體中拖放乙個button控制項,雙擊該控制項,在form1.cs中將會自動生成單擊處理程式

private void button1_click(object sender, eventargs e)

仔細一看,該處理方法跟本例observer類中的  public void warning(object sender, memeryobserveeventargs args)很相似最後乙個引數稍微有些差別,這是因為各自定義的事件引數不同, 在void warning(object sender, memeryobserveeventargs args)中,我們要獲得subject(主體)的當前容量,即currentvolume,而在void button1_click(object sender, eventargs e)中,我們可能 要獲取其他與subject有關的資訊,開啟form1.designer.cs檔案,展開"windows 窗體設計器生成的**"你會找到"this.button1.click += new system.eventhandler(this.button1_click)"這句**,再仔細一看,你會發現它跟本例寫過的 status.memeryobserve+=new memeryobserveeventhandler(observer.warning);這句很相似。我們知道,memeryobserveeventhandler是我們定義的乙個委託,它的方法簽名要求這樣的形式"void 函式名(object param1,memeryobserveeventargs param2)",那麼,system.eventehandler其實也是個委託,類似這樣定義:public delegate void eventhandler(object sender,eventargs args).所以,button類就是observer模式中的主體,相當於本例 中的memerystatus類 ,this.button1相當於本例中的status(事件發布者),form1(即窗體類)就相當於本例中的observer(觀察者)。這樣,觀察者(form1)觀察被觀察者(button)的狀態變化(比如被單擊),作出相應的動作(執行void warning(object sender, memeryobserveeventargs args))。

我們現在來比較一下本例程式和新建winform預設程式

1、本例中主體(即事件發布者)為memerystatus類,winform中的主體為button類;

2、本例中事件為memeryobserve,winform中事件為click;

3、本例中事件引數類為memeryobserveeventargs,winform中事件引數類為eventargs;

4、本例中觀察者(即事件訂閱者)為observer類,winform中觀察者為窗體,即form1類;

5、本例中當事件發生,**函式為 public void warning(object sender, memeryobserveeventargs args),winform中**函式為private void    button1_click(object sender, eventargs e);

6、本例中當記憶體已用容量大於95時,觸發事件memeryobserve,winform中當使用者點選按鈕時,觸發事件click;

using system;

using system.collections.generic;

using system.linq;

using system.text;

}public memeryobserveeventargs(int c)

}public delegate void memeryobserveeventhandler(object sender,memeryobserveeventargs args); //委託

public class memerystatus                    //subject,主體/publisher,事件發布者

set}}}

public class observer                             //觀察者,observer/事件訂閱者

\n", args.currentvolume);}}

class program                                       //客戶端

console.read();}}

}//輸出結果:

//當前容量超過上限容量96

//當前容量超過上限容量97

//當前容量超過上限容量98

//當前容量超過上限容量99

//本**在vs2008中執行通過

委託與事件

1.建立乙個類,分別建立加 減 乘 除四個方法,通過委託和事件,實現 輸入兩個計算數,完成所有的四個方法的呼叫,計算出結果顯示。建立乙個警察 policeman 類,乙個小偷 thief 類,例項化兩個類的物件,當policeman類中警笛鳴響 alarm 方法執行時,觸發小偷逃跑 runaway ...

委託與事件

委託就是以方法做引數進行傳遞,它定義的是方法的框架,如果用這個委託,所宣告的方法就必須按照給定的引數及返滬型別進行處理。宣告委託的方式 delegate 返回值型別 委託型別名 引數 比如delegate void stringprocess string s 注意這裡的除了前面的delegate,...

委託與事件

委託與事件 一 委託 delegate 1 委託是一種可以把引用儲存為函式的型別。2 在定義了委託後,就可以宣告該委託型別的變數,接著把這個變數初始化為與委託有相同返回型別和引數類別的函式引用,之後,就可以使用委託變數呼叫這個函式,就像該變數是乙個函式一樣。如 double multiply dou...