Delegate
delegate是C#中的一種類(lèi)型,它實(shí)際上是一個(gè)能夠持有對(duì)某個(gè)方法的引用的類(lèi)。與其它的類(lèi)不同,delegate類(lèi)能夠擁有一個(gè)簽名 (signature),并且它只能持有與它的簽名相匹配的方法的引用。它所實(shí)現(xiàn)的功能與C/C++中的函數(shù)指針十分相似。它允許你傳遞一個(gè)類(lèi)A的方法m給另一個(gè)類(lèi)B的對(duì)象,使得類(lèi)B的對(duì)象能夠調(diào)用這個(gè)方法m。但與函數(shù)指針相比,delegate有許多函數(shù)指針不具備的優(yōu)點(diǎn)。
首先,函數(shù)指針只能指向靜態(tài)函數(shù),而delegate既可以引用靜態(tài)函數(shù),又可以引用非靜態(tài)成員函數(shù)。在引用非靜態(tài)成員函數(shù)時(shí),delegate不但保存了對(duì)此函數(shù)入口指針的引用,而且還保存了調(diào)用此函數(shù)的類(lèi)實(shí)例的引用。
其次,與函數(shù)指針相比,delegate是面向?qū)ο?、?lèi)型安全、可靠的受控(managed)對(duì)象。也就是說(shuō),runtime能夠保證delegate指向一個(gè)有效的方法,你無(wú)須擔(dān)心delegate會(huì)指向無(wú)效地址或者越界地址。
delegate?是一種可用于封裝命名或匿名方法的引用類(lèi)型。?委托類(lèi)似于 C++ 中的函數(shù)指針;但是,委托是類(lèi)型安全和可靠的。
委托是一個(gè)類(lèi),它定義了方法的類(lèi)型,使得可以將方法當(dāng)作另一個(gè)方法的參數(shù)來(lái)進(jìn)行傳遞,這種將方法動(dòng)態(tài)地賦給參數(shù)的做法,可以避免在程序中大量使用if-else和switch語(yǔ)句,同時(shí)使得程序具有更好的可擴(kuò)展性。
事件就是一個(gè)狹義的委托,也就是事件是一個(gè)用于事件驅(qū)動(dòng)模型的專(zhuān)用委托。你可以在客戶代碼中直接調(diào)用委托來(lái)激發(fā)委托指向的函數(shù),而事件不可以,事件的觸發(fā)只能由服務(wù)代碼自己觸發(fā)。也就是說(shuō)在你的代碼里委托你不但可以安排誰(shuí)是它的調(diào)用函數(shù),還可以直接調(diào)用它,而事件不能直接調(diào)用,只能通過(guò)某些操作觸發(fā)。除此之此,事件擁有委托的所有功能,包括多播特性。
委托是類(lèi)型,事件是對(duì)象 ,事件是封裝過(guò)的委托實(shí)例。也就是說(shuō),事件是面向?qū)ο蟮漠a(chǎn)物,它是封裝性比較典型的示例。在.net中,事件是一種特殊的委托,那他到底特殊在哪,換句話說(shuō),加上event關(guān)鍵字到底有什么用,我理解主要有兩方面:
一、對(duì)于事件來(lái)講,只能在本類(lèi)型內(nèi)部“觸發(fā)”,外部只能“注冊(cè)自己+=、注銷(xiāo)自己-=“,委托不管在本類(lèi)型內(nèi)部還是外部都可以“調(diào)用”,因此如果用delegate就沒(méi)法進(jìn)行上面的控制,所以誕生了事件這種語(yǔ)法。
二、在類(lèi)的外部,事件只能add、remove自己,不能賦值,即事件只能“+=”、“-=”,不能“=”,這樣在一定程度上保證了event系統(tǒng)在一個(gè)事件觸發(fā)后注冊(cè)過(guò)的方法都會(huì)得到通知,而不會(huì)被一個(gè)錯(cuò)誤的賦值把別的已經(jīng)注冊(cè)的方法都覆蓋掉。