要理解事件,首先必須理解委托!!
1、如果說委托是一個類型,那么事件就是一個對象!
2、事件的創建必須是借助某個委托類型來完成的!
3、也就是說,委托是事件的類型,事件本身是個對象!!
4、所以,事件也可以看成是一個,受到約束的委托實例(委托對象)。
我們知道委托存在多播委托:(也就是一個委托可以指向多個方法!)
下面這種簡寫形式,編譯器幫我們進行了new!看上去是直接與方法關聯,其實還是通過委托!
而事件的本質是:
所以,事件和方法關聯起來的方式,是差不多的:
this.button1.Click += new System.EventHandler(this.button1_Click);
過程就是,首先new一個委托實例,這個委托實例通過構造函數,由一個方法初始化。事件再添加這個委托,從而關聯這個方法。
下次,這個事件被促發是,這個方法就會被調用!
//----------------------進一步理解事件-----------------------------------
之前我們說,委托的目的是讓方法可以做為參數。而事件是將委托的實例進行了封裝。那事件的目的是什么呢?
.NET為我們提供的很多類,類里有屬性,方法,以及事件。比如Button類就為我們提供了點擊事件。
當我們點擊按鈕的時候就會執行下面這段程序對吧:
private void BtnOpen_Click(object sender, EventArgs e){}
但是我們要清楚,BtnOpen_Click他並不是事件本身,而是事件注冊的方法!
事件的聲明,已經注冊,VS已經幫我們完成了:
public delegate void EventHandler( object sender , EventArgs e )//委托的聲明
public event EventHandler Click; //利用委托定義事件Click,注意格式事件這里不需要簽名(返回值,參數值)
Click += new System.EventHandler(BtnOpen_Click);//為事件注冊方法
VS幫我們做完這些事情之后,就把這個空着的BtnOpen_Click方法丟給我們,讓程序員自己來實現方法的具體內容。
講到這里,我們再來想想事件的目的是什么?或者說微軟那幫人,設計事件這個機制是為啥?也就是說,事件事先
注冊好方法,當事件觸發時該方法會被調用,但是該方法具體內容先不管,如果你要用到這個事件的時候,自己去
實現這個注冊了的方法!這樣當用戶要用到這個類的這個事件時,所以關注的僅僅是這個注冊了的方法而已!
講到這個里,還有兩點是操作系統幫我們完成的,及事件的偵聽,以及事件的觸發!比如操作系統會偵聽這個按鈕何時
會被按下,一旦按鍵按下就會就會有消息被放到消息隊列,當再次采集到這個消息時,事件就會觸發,操作系統就會去
調用BtnOpen_Click方法。並且還會為這個BtnOpen_Click方法傳參,(object sender, EventArgs e)sender就是產生
事件的對象,e包含了事件的一些細節內容。
//-----------------------------事件和委托的區別------------------------------------
事件的本質是封裝了一個私有的委托,和兩個方法。
這導致了當事件定義到某個類中,它不允許在類的外部被直接觸發,只能在類的內部適合的時機觸發。
事件的促發其實就是其中這個私有委托的調用!!雖然說事件只能在類的內部適合的時機觸發。
但是事件可以放到一個公開的方法里,而這個公開的方法可以在外部調用。
總結:
1、聲明事件之前,需要聲明委托,委托一般放在類的外面並且用public修飾!
public delegate void 委托名(object sender, EventArgs e);
2、委托聲明好了之后就可以利用委托聲明事件,此時事件無需標簽(返回值,參數值)。
public event 委托名 事件名; 利用委托定義事件Click,注意格式事件這里不需要簽名。
3、事件就是封裝了一個私有的委托,事件的促發其實就相當於私有委托的調用,所以事件的促發只能是類的內部。
而事件的注冊往往是在其他的地方!