##delegate委託
delegate是c#中的一種型別,它實際上是乙個能夠持有對某個方法的引用的類。與其它的類不同,delegate類能夠擁有乙個簽名(signature),並且它"只能持有與它的簽名相匹配的方法的引用"。
它所實現的功能與c/c++中的函式指標十分相似。它允許你傳遞乙個類a的方法m給另乙個類b的物件,使得類b的物件能夠呼叫這個方法m。但與函式指標相比,delegate有許多函式委託和事件在 .net framework中的應用非常廣泛指標不具備的優點。首先,函式指標只能指向靜態函式,而delegate既可以引用靜態函式,又可以引用非靜態成員函式。在引用非靜態成員函式時,delegate不但儲存了對此函式入口指標的引用,而且還儲存了呼叫此函式的類例項的引用。其次,與函式指標相比,delegate是物件導向、型別安全、可靠的受控(managed)物件。也就是說,runtime能夠保證delegate指向乙個有效的方法,你無須擔心delegate會指向無效位址或者越界位址。
##結合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
}}
##總結:
1.委託是乙個類,它定義了方法的型別,使得可以將方法當作另乙個方法的引數來進行傳遞,這種將方法動態地賦給引數的做法,可以避免在程式中大量使用if-else(switch)語句,同時使得程式具有更好的可擴充套件性。
2.使用委託可以將多個方法繫結到同乙個委託變數,當呼叫此變數時(這裡用「呼叫」這個詞,是因為此變數代表乙個方法),可以依次呼叫所有繫結的方法。
3.在使用委託的時候,你可以像對待乙個類一樣對待它。即先宣告,再例項化。只是有點不同,類在例項化之後叫物件或例項,但委託在例項化後仍叫委託。
4.事件應該由事件發布者觸發,而不應該由客戶端(客戶程式)來觸發。
##最後以《鴻門宴》中的乙個虛擬情節來體會委託的用法:
鴻門宴之前,項羽和手下的范增和項莊商量好了,等他和劉邦喝酒的時候,項羽左手舉起酒杯,范增就出兵刺殺劉邦;項羽右手舉起酒杯,項莊就出兵刺殺劉邦;如果項羽摔碎了酒杯,范增和項莊就一起出兵刺殺劉邦。
using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.threading.tasks;
namespace 委託
手舉杯"
, hand)
;// 呼叫舉杯事件,傳入左或右手作為引數
if(raiseevent !=
null)}
///
/// 定義項羽摔碎酒杯事件的觸發函式
///
public
void
fall()
}}///
/// 定義項羽部下范增
///
public
class
fanzeng
///
/// 范增對項羽舉杯事件的響應
///
/// 若項羽左手舉杯,則範增發起攻擊
void
xiangyu_raiseevent
(string hand)
}///
/// 范增對項羽摔碎酒杯事件的響應
///
void
xiangyu_fallevent()
///
/// 定義攻擊的函式
///
public
void
attack()
}///
/// 部下項莊
///
public
class
xiangzhuang
///
/// 項莊對項羽舉杯事件的響應
///
/// 若項羽右手舉杯,則攻擊
void
xiangyu_raiseevent
(string hand)
}///
/// 項莊對項羽摔碎酒杯事件的響應
///
void
xiangyu_fallevent()
///
/// 定義攻擊的函式
///
public
void
attack()
}//主函式
c 中的委託與事件
c 委託與事件 一 委託 關鍵字 delegate 委託是c 中的一種型別,它實際上是乙個對某個方法引用的類 委託是一種引用方法型別 一旦為委託分配了方法 委託將與該方法有相同完全的行為 委託具有引數 和返回值 delegate類能擁有乙個簽名 signature 只能持有與他簽名相匹配的方法的引用...
C 中的委託與事件
寫這篇博文的目的是要記錄一下學習委託與事件的心的與 方便之後查閱 1 委託,是乙個函式的簽名,規定了函式的返回值與引數列表。類似於這類函式的乙個 簽名相同但是用途不同的函式s,要執行的時候就通過 來執行,使得函式執行得到諸多的方便。delegate相當於乙個類,具有類的一些特性。2 事件,事件就是應...
C 中的委託與事件 筆記
1.委託是型別安全的 函式,是將方法作為方法引數。委託可以註冊多個方法 委託就是乙個 multicastdelegate類,可以通過 賦值,新增方法 物件方法與靜態方法 內部使用delegate.combine方法新增方法。2.事件 事件也是委託,是對委託的封裝,將委託宣告成private成員,不讓...