1. 程式人生 > >c#中Delegate和Event和區別

c#中Delegate和Event和區別

     :( 如果想直接進入正題請略過這段)最近開始積累一些以前知道的和不知道的C#,Unity3D,Shader知識。上大學的時候只顧好好考研,好好打球,好好彈吉他,沒有太多接觸技術部落格(誰知後來硬生生成了一個文藝的程式設計師。。。)。讀研的時候寫部落格覺得有點晚了,因為當時在忙著找工作,於是列印好紙質的去看,到後來有了厚厚一摞A4紙。工作以後寫部落格還是覺得有點晚,找藉口總沒開始。。。那天突然發現自己的膝上型電腦開不了了,精覺以前列印的電子稿,好多珍貴資料消失了,於是痛定思痛,還是寫部落格,學到老活到老,哦,不對,反正就是什麼時候都遲,共勉~(可以百度到的我就不復制了,儘量通俗易懂點,完整點)

       正題:Delegate中文代表,俗稱委託,代理。使用它定義即表示這是一個相同返回值、引數和函式名字的函式列表。通俗點,這塊記憶體中有若干個函式,函式的有個統一的名字,還有相同的返回值和引數。

       比如:public delegate void OnStateChanged(int oldState, int newState);

       符合這種引數和返回值的函式就可以繫結在OnStateChanged上,因為Delegate過載了+=,-=等運算子(這個類似過載運算子熟悉C++底層的會比較瞭解,有本書後面找到給大家付一下吧,一時想不起來了,主要講面向物件底層是如何實現的)。

        不同點: Event在Delegate上封裝了一層,內部其實也有Delegate,區別在於Delegate可以使用=,而Event不可以,這是第一點區別。第二點不同的地方在於Event可以放在介面中宣告,但是Delegate不可以(會報錯)。

        所以使用Event比較好(其實我覺得兩個是一回事),event是delegate的封裝,確保了大家不會誤使用=,而且還能放在介面中,可以實現面向介面程式設計。

        正確的用法:public delegate void OnStateChanged(int oldState, int newState);

                              public event OnStateChanged OnFlyStateChanged;

                               public void FlyStateChanged(int oldState, int oldState)

                               {

                                       .......;

                               }

                                OnStateChanged += FlyStateChanged;

       這樣在所有OnStateChanged執行的地方就會去做FlyStateChanged這個事情了。可能就像訂閱報紙,我訂閱了,你發行了就告訴我處理。而且可能有多個人訂閱。OnStateChanged += ActionStateChanged;(其他人ding訂閱);OnStateChanged -= ActionStateChanged(其他人取消訂閱)。