從使用層面上了解委託和事件的區別

2021-09-23 19:21:32 字數 2084 閱讀 4125

從本篇文章中,我們將從**層面知道委託和事件的差異和用處,並且我們不會用貓和老鼠之類奇怪的比喻來混淆大家。

首先,我們知道委託和事件都可以用來呼叫跟自己方法簽名一樣的方法。容易混淆大家的地方大多在於這兩者之間的區別。從我們使用委託delegate和事件event上的主要有兩大區別(如表1所示)。

表1 委託和事件的區別

序號區別

委託事件

1是否可以使用=來賦值是否

2是否可以在類外部進行呼叫是否

3是否是乙個型別

是否,事件修飾的是乙個物件

--參考msdn上關於委託和事件的定義。

我們將建立兩個類classa和classb,這兩個類都很簡單,只有乙個方法,並且這兩個類的方法簽名一樣。classc內有委託和事件,為了演示方便,我們將委託和事件的訪問許可權都設為public。下面我們將主要看看委託和事件在使用上面的區別。

錯誤    1    「testeventdelegate.classc.say_eventhandler」是「字段」,但此處被當做「型別」來使用

(1)在類外部呼叫委託

static

void main(string args)

結果截圖:

(2)在類外部呼叫事件

提示錯誤:

事件「testeventdelegate.classc.say_eventhandler」只能出現在 += 或 -= 的左邊(從型別「testeventdelegate.classc」中使用時除外)

從編譯器提示的錯誤,我們可以了解到,事件只能在宣告它的類內部被呼叫。從事件本身來講,事件一般用於類自身的屬性變化時,用來通知外界自身的變化的。我們將對classc內部的乙個屬性賦值,然後呼叫事件,模擬對外通知。**如下所示

static 

void

main(

string

args

)

結果截圖

1、委託可以把乙個方法作為引數代入另乙個方法。 委託可以理解為指向乙個函式的指標。

2、委託和事件沒有可比性,因為委託是型別,事件是物件

3、其實事件是委託的乙個修飾符,加了event(事件)修飾之後,委託就被閹割了,假設這個加了修飾符的事件稱為事件1,通過事件1我們可以更好地控制註冊和登出,也就是對於乙個外部類,那麼他只能「註冊自己+=、登出自己-=」,例如上面的classa,如果我們事件的註冊是在classa內部進行的,那麼它就只能註冊自己內部的方法到事件上。另外,外界也不能主動地觸發乙個事件。事件只能add、remove自己,不能賦值。也就是說事件只能+=、-=,不能= 。當我們反編譯以上例子的源程式的時候,我們可以發現事件內部就是乙個private的委託和add、remove兩個方法 (如下圖所示)。

出處:

從使用層面上了解委託和事件的區別

從本篇文章中,我們將從 層面知道委託和事件的差異和用處,並且我們不會用貓和老鼠之類奇怪的比喻來混淆大家。首先,我們知道委託和事件都可以用來呼叫跟自己方法簽名一樣的方法。容易混淆大家的地方大多在於這兩者之間的區別。從我們使用委託delegate和事件event上的主要有兩大區別 如表1所示 表1 委託...

從使用層面上了解委託和事件的區別

從本篇文章中,我們將從 層面知道委託和事件的差異和用處,並且我們不會用貓和老鼠之類奇怪的比喻來混淆大家。首先,我們知道委託和事件都可以用來呼叫跟自己方法簽名一樣的方法。容易混淆大家的地方大多在於這兩者之間的區別。從我們使用委託delegate和事件event上的主要有兩大區別 如表1所示 表1 委託...

C 委託和事件的使用示例

一 委託 使用委託時要先例項化,和類一樣,使用new關鍵字產生委託的新例項,然後將乙個或者多個與委託簽名匹配的方法與委託例項關聯。隨後呼叫委託時,就會呼叫所有與委託例項關聯的方法。與委託關聯可以是任何類或者結構中的方法,可以是靜態方法,只要是可以訪問的方法都可以。1.建立乙個委託型別使用關鍵字del...