在.net中,事件是一種特殊的委托,那他到底特殊在哪,換句話說,加上event關鍵字到底有什么用,我理解主要有兩方面,下面用實例說明:
一 、事件只能在本類型內部“觸發”,委托不管在本類型內部還是外部都可以“調用”。
舉個例子,按鈕的Click事件只有在鼠標點擊按鈕才能觸發,沒有例外;但如果Click是委托的話,我可以通過代碼直接調用這個委托,就可以使得Click事件中的代碼執行,這不合規矩。看例子:
//定義一個委托
Public delegate void testEventHandler(object sender,EventArgs e);
Public Class Class1
{
//定義一個事件
public testEventHandler CheckDiff;
public Class1()
{
CheckDiff+=new testEventHandler(test1);
}
Public void test1(object o,EventArgs e)
{
MessageBox.Show("I am A");
}
}
Class1 c=new Class1();
c.diff(this,new EventArgs());
這時,我們在類的外部調用他是沒有問題的。可以得到結果。但如果我們在定義的時候使用event關鍵字,如下
public event testEventHandler CheckDiff;
則不能通過編譯,提示“CheckDiff只能出現在+=或-=左邊(Class1中使用時除外)”,也就是說我們在類的外部只能添加和刪除注冊,但不呢功能使用這個事件了,提示中的“除外”指什么,就是在類的內部是可以調用這個事件的,在構造函數中可以調用下試試結果是沒有問題的,例子如下:
public Class1()
{
CheckDiff+=new testEventHandler(test1);
CheckDiff(this,new EventArgs());
}
二、在類的外部,事件只能用“+=”和“-=”去訂閱/取消訂閱,如果是委托的話還可以使用“=”。
首先去掉將事件定義的event去掉,讓他變成委托,然后在調用Class1的地方使用“=”綁定委托的方法。
Class1 c=new Class1();
c.CheckDiff=new testEventHandler(c.test1);
這樣是沒有問題的。但增加了event關鍵字后,想要增加和取消訂閱只能使用“+=”和“-=”。