總結 : C#事件理解


要理解事件,首先必須理解委托!!

1、如果說委托是一個類型,那么事件就是一個對象!

2、事件的創建必須是借助某個委托類型來完成的!

3、也就是說,委托是事件的類型,事件本身是個對象!!

4、所以,事件也可以看成是一個,受到約束的委托實例(委托對象)。

我們知道委托存在多播委托:(也就是一個委托可以指向多個方法!)

clip_image002

下面這種簡寫形式,編譯器幫我們進行了new!看上去是直接與方法關聯,其實還是通過委托!

clip_image004

而事件的本質是:

clip_image006

所以,事件和方法關聯起來的方式,是差不多的:

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、事件就是封裝了一個私有的委托,事件的促發其實就相當於私有委托的調用,所以事件的促發只能是類的內部。

而事件的注冊往往是在其他的地方!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM