委託與事件

2021-07-25 13:38:41 字數 2604 閱讀 8194

委託是乙個類,它定義了方法的型別,使得可以將方法當作另乙個方法的引數來進行傳遞,這種將方法動態地賦給引數的做法,可以避免在程式中大量使用if-else(switch)語句,同時使得程式具有更好的可擴充套件性。

net中的委託從功能上講和c語言或者c++中的方法指標類似,可以像呼叫方法一樣呼叫委託完成某個功能,或返回某類結果。但是.net畢竟是更高階的語言,委託delegate也更高階了,委託是一種資料介面,它包含呼叫目標和呼叫方法的指標;而在.net中定義的委託都繼承自multicastdelegate即多播委託,所謂的多播委託是指可以包含多個呼叫方法的委託。

委託的定義:

如下c#**定義委託

public delegate void dosomething(int times);

委託的定義包含5個部分

1) public表示委託的可訪問性

2) delegate關鍵字表示要定義乙個委託

3) void表示委託定義方法的返回值

4) dosomething是委託的名字

5) (int times) 是委託方法的引數列表,此處的引數列表可以包括ref引數,也可以有out引數,同樣也可以有parms可變數量引數;需要注意如果委託中有多個呼叫方法,使用out引數時只能返回委託最後執行成功的乙個委託方法的計算值

delegate

delegate是c#中的一種型別,它實際上是乙個能夠持有對某個方法的引用的類。與其它的類不同,delegate類能夠擁有乙個簽名 (signature),並且它只能持有與它的簽名相匹配的方法的引用。它所實現的功能與c/c++中的函式指標十分相似。它允許你傳遞乙個類a的方法m 給另乙個類b的物件,使得類b的物件能夠呼叫這個方法m。但與函式指標相比,delegate有許多函式指標不具備的優點。首先,函式指標只能指向靜態函 數,而delegate既可以引用靜態函式,又可以引用非靜態成員函式。在引用非靜態成員函式時,delegate不但儲存了對此函式入口指標的引用,而 且還儲存了呼叫此函式的類例項的引用。其次,與函式指標相比,delegate是物件導向、型別安全、可靠的受控(managed)物件。也就是 說,runtime能夠保證delegate指向乙個有效的方法,你無須擔心delegate會指向無效位址或者越界位址。

實現乙個delegate是很簡單的,通過以下3個步驟即可實現乙個delegate:

1.  宣告乙個delegate物件,它應當與你想要傳遞的方法具有相同的引數和返回值型別。

2.  建立delegate物件,並將你想要傳遞的函式作為引數傳入。

3.  在要實現非同步呼叫的地方,通過上一步建立的物件來呼叫方法。

public class mydelegatetest

", name);

}public static void main()

}

事件(event)

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.           在適當的地方呼叫事件觸發方法觸發事件。

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

my event is ok!

委託與事件

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

委託與事件

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

委託與事件

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