首先,我們知道委託和事件都可以用來呼叫跟自己方法簽名一樣的方法。容易混淆大家的地方大多在於這兩者之間的區別。從我們使用委託delegate和事件event上的主要有兩大區別(如表1所示)。
表1 委託和事件的區別
序號區別
委託事件
1是否可以使用=來賦值是否
2是否可以在類外部進行呼叫是否
3是否是乙個型別
是否,事件修飾的是乙個物件
--參考msdn上關於委託和事件的定義。
我們將建立兩個類classa和classb,這兩個類都很簡單,只有乙個方法,並且這兩個類的方法簽名一樣。classc內有委託和事件,為了演示方便,我們將委託和事件的訪問許可權都設為public。下面我們將主要看看委託和事件在使用上面的區別。
錯誤 1 「testeventdelegate.classc.say_eventhandler」是「字段」,但此處被當做「型別」來使用
(1)在類外部呼叫委託
static void main(string args)
classc.say handler = classa.classa_say;
handler += classb.classb_say;
handler();
結果截圖:
(2)在類外部呼叫事件
提示錯誤:
事件「testeventdelegate.classc.say_eventhandler」只能出現在 += 或 -= 的左邊(從型別「testeventdelegate.classc」中使用時除外)
從編譯器提示的錯誤,我們可以了解到,事件只能在宣告它的類內部被呼叫。從事件本身來講,事件一般用於類自身的屬性變化時,用來通知外界自身的變化的。我們將對classc內部的乙個屬性賦值,然後呼叫事件,模擬對外通知。**如下所示
static void main(stringargs)
結果截圖
1、委託可以把乙個方法作為引數代入另乙個方法。 委託可以理解為指向乙個函式的指標。
2、委託和事件沒有可比性,因為委託是型別,事件是物件
3、其實事件是委託的乙個修飾符,加了event(事件)修飾之後,委託就被閹割了,假設這個加了修飾符的事件稱為事件1,通過事件1我們可以更好地控制註冊和登出,也就是對於乙個外部類,那麼他只能「註冊自己+=、登出自己-=」,例如上面的classa,如果我們事件的註冊是在classa內部進行的,那麼它就只能註冊自己內部的方法到事件上。另外,外界也不能主動地觸發乙個事件。事件只能add、remove自己,不能賦值。也就是說事件只能+=、-=,不能= 。當我們反編譯以上例子的源程式的時候,我們可以發現事件內部就是乙個private的委託和add、remove兩個方法 (如下圖所示)。
1、委託的作用:
佔位,在不知道將來要執行的方法的具體**時,可以先用乙個委託變數來代替方法呼叫(委託的返回值,引數列表要確定)。在實際呼叫之前,需要為委託賦值,否則為null。
2、事件的作用:
3、在自定義控制項(自己編寫控制項的時候,會大量用到.編寫控制項的時候,會寫一些事件。但是當這些事件 被觸發以後,具體執行的那些事件處理程式是編寫控制項的人沒法確定的。這個時候只能通過事件來佔位(呼叫),具體呼叫的是哪個方法,由使用控制項的人來決定(click+=new 委託(方法名);))
委託和事件的區別
首先,我們知道委託和事件都可以用來呼叫跟自己方法簽名一樣的方法。容易混淆大家的地方大多在於這兩者之間的區別。從我們使用委託delegate和事件event上的主要有兩大區別 如表1所示 表1 委託和事件的區別 序號區別 委託事件 1是否可以使用 來賦值是否 2是否可以在類外部進行呼叫是否 3是否是乙...
事件繫結和事件委託區別
靜態繫結,也是最直接的事件繫結 通過事件屬性,直接顯示的給元素繫結事件,例如 該方式缺點 當頁面多元素都要新增事件時,定義繁瑣。函式名稱定義改變,一次要修改兩個地方。動態繫結 關於事件監聽的適配 因為ie 有自己的事件監聽 attachevent 和detachevent 分別用於事件監聽 obtn...
事件和委託 委託和事件區別 不斷更新
01 簡單的委託 那委託需要承載哪些資訊呢?首先,它儲存了方法名,還有引數列表 方法簽名 以及返回的型別。比如 delegate string 返回型別 processdelegate int i 這就是乙個委託的定義。藍色部分是宣告委託的關鍵字,紅色部分是返回的型別,而黑色部分是委託的型別名,和乙...