C 委託和事件

2021-09-30 11:01:36 字數 1935 閱讀 6813

我需要開發乙個報警系統,老大提示了需要用到「事件」這個概念。

於是我查詢了相關資料,發現c#的「事件」概念是建立於委託和事件上的,進而衍生出observer設計模式。

這裡我先談一下我對委託和事件的理解,在c#中它們其實就是對應了兩個關鍵字「delegate」和「event」。

1)委託

首先看幾個常見的函式簽名:

public void getchinesename(string name);

public void getenglishname(string name);

可以看出,上述兩個函式只有名稱上的不同,當我們在定義變數時,諸如:string name1;string name2;時,變數name1,name2也只是名稱上的不同,但是都屬於string型別。那麼是否可以用某個類似「string」的型別,定義不同名稱的「函式變數」呢?有了delegate就可以。

public delegate void getnamedelegate(string name);
比較這個定義與上前面的函式簽名,只是多了乙個delegate關鍵字,這裡即使用了delegate關鍵字創造了乙個委託型別,名稱是getnamedelegate,等同於string。

正如string定義字串型別,委託定義了「函式型別」。接下來就可以利用getnamedelegate幹與string類似的事了。注意有一點不同是,同乙個委託變數可以繫結多個函式。

getnamedelegate mydelegate = new getnamedelegate(getchinesename);

mydelegate += getenglishname;

當然,也可以這麼用:

getnamedelegate mydelegate;

mydelegate = getchinesename;

mydelegate += getenglishname;

是不是很類似我們平時定義變數的感覺?注意,第一次繫結函式時候,必須用「=」,之後如需繫結多個函式,用「+=」。這樣很彆扭,使用之後的事件即可避免這種情況。

這樣利用語句:

mydelegate("yis");
會先後呼叫public void getchinesename("yis")和public void getenglishname("yis")兩個方法。

因此,委託定義函式的型別,方便我們將乙個函式作為另乙個函式的引數傳遞進去。

使用委託可以將多個僅不同名稱的函式繫結到同乙個變數,呼叫(這裡用「呼叫」這個詞,是因為此變數代表乙個方法)變數時可以依次呼叫所有繫結的方法。

2)事件

事件就是封裝了委託型別的變數,就如同在類中封裝string型別時用屬性,那封裝delegate型別時就用事件。而且統統利用「+=/-=」繫結/解綁函式,利用event關鍵字:

public event mydelegate makedelegate;
事件將原來的委託變數mydelegate封裝成乙個新的委託變數makedelegate,它總是private,我們就可以這麼幹了

makedelegate += getchinesename;

makedelegate += getenglishname;

注意都是用的「+=」,這樣利用語句:
makedelegate("yis");
依然會先後呼叫public void getchinesename("yis")和public void getenglishname("yis")兩個方法。

observer設計模式就應用了委託與事件,還有待我繼續研究喲。

C 事件和委託

c 程式設計中的事件驅動是說應用程式的執行流程是由外界發生的事件確定的。也就是接受到任務再工作的模式。事件是乙個訊號,它告知應用程式有重要的事情發生。真正的執 況是,各個應用程式把負責不同功能的物件在其執行期間送入windows作業系統,讓這些物件等待windows產生事件。然後加以處理,windo...

C 委託和事件

什麼是委託?委託和事件這兩個概念是完全配合的。委託僅僅是函式指標,那就是說,它能夠引用函式,通過傳遞位址的機制完成。委託是乙個類,當你對它例項化時,要提供乙個引用函式,將其作為它建構函式的引數 先看示例 例中先申明乙個委託,例如 public delegate void somedelegate s...

C 委託和事件

要為類構造乙個事件,必須用 event 來宣告乙個 delegate 型的字段,如 puclic calss test 在建立類的例項後定義這個 load 事件 test m new test m.load new eventhandler m load void m load object sen...