事件
文法
通路修飾符 event 委托名稱 事件名稱;
定義事件:
public delegate void deltest();
public event deltest eventtest;
注冊事件(可以給一個事件注冊多個方法)
eventtest += new deltest(method1);
eventtest += new deltest(method2);
自定義事件的基礎
1.當一個結果發生時,有可能引起另外的一些反應。這就好像因果關系。而事件,則是這個因與果的内部聯系。
2.在c#中,我們經常看到:
上面是一個按鈕的單擊事件。
從上面我們可以看到三個事件因素:
1.對象:button,
2.事件名:click
3.參數:object sender(事件源),其實就是button,eventargs e 則引發這個事件的原因。
從上面按鈕的單擊事件中,我們可以看出一個簡單的規則:
1.要聲明對象。這個在發生改變後,所能引起後果的對象。在上例中就是button,它在單擊後,引起了代碼段的一系列改變。
2.事件名。它定義了是什麼樣的改變,是對象所發生的動作的名稱。上例中,是click,
3.參數。一個是基本上固定的。另外一個是引發這個事件的原因.
是以,難點就在這個引發事件上。這是我們從系統事件中學習到的東西.接下來,我們再學習事件運作的原理;
使用者的操作,并觸發事件的觸發方法。
事件的觸發方法
事件的處理方法
這就是事件的運作原理.是以,重點還是在觸發事件的觸發方法上.
自定義事件的執行個體
釋出事件的類testeventsource:
監聽事件的類testeventlistener
測試:
結果:
結論:
testeventsource類。他就相當于windows控件類一樣,是事件的源,裡面包含有事件的聲明,以及存儲調用參數的事件參數類,以及事件的觸發方法。
testeventlistener類。他提供了事件處理程式,并實作了事件處理程式和事件對象的邦定,當然時間處理程式可以放在别處, 跟邦定程式(訂閱事件)放在一起便于了解和調用
test 類,執行個體化自定義事件的事件源對象,并調用 testeventlistener類中的subscribe(es);方法進行事件對象和事件處理程式的邦定(訂閱事件),調用 testeventsource類中的raiseevent(char keytoraiseevent)引發對象,并有對象所指定的委托回調處理事件。完成整個自定義事件。
其中 raiseevent(char keytoraiseevent) 就相當于main()一樣是自定義事件的執行入口, 從這個法開始---〉調用事件委托----〉查找訂閱事件程式找到事件所封裝的方法集----〉由委托回調事件處理程式并傳遞參數---〉執行事件處理程式。
委托與事件總結
委托的作用:
占位,在不知道将來要執行的方法的具體代碼時,可以先用一個委托變量來代替方法調用(委托的傳回值,參數清單要确定)。在實際調用之前,需要為委托指派,否則為null。
事件的作用:
事件的作用與委托變量一樣,隻是功能上比委托變量有更多的限制。(比如:1.隻能通過+=或-=來綁定方法(事件處理程式)2.隻能在類内部調用(觸發)事件。)
委托:類型安全的指向函數的指針
使用步驟
1:聲明一個委托 delegate string delstring(string s)
2:定義一個委托變量
delstring del = new delstring(toupper)
delstring del = toupper
3:使用委托
del(s);
匿名方法*
delstring del = delegate(string s) { console.writeline(s); }
多點傳播委托
delmath del = add;
del += sub; del = del + sub;
del += mul;
del -= mul;
原理 定義一個事件的時候生成一個私有的委托
通過生成的add和remove方法對委托注冊方法和移除方法
調用事件的時候最終調用的是委托指向的方法
使用步驟
1:定義事件
public event eventhandler playover;
2:調用事件
if (playover != null)
{
playover(this, null);
}
3:外部注冊事件
player1 p = new player1("真的恨你");
p.playover += new playovereventhandler(p_playover);
p.play();
eventhandler 事件委托
eventargs 事件源參數
事件是成員
由于事件不是類型,是以我們不能使用對象建立表達式(new表達式)來建立它的對象
事件必須聲明在類或結構中,和其他成員一樣
我們不能在一段可執行代碼中聲明事件
事件被隐式自動初始化為null
事件使用的标準模式的根本就是system命名空間聲明的eventhandler委托類型。eventhandler委托雷池的聲明如下面代碼所示。
1.第一個參數用來儲存觸發事件的對象的引用。由于是object類型,是以可以比對任何類型的執行個體。
2.第二個參數用來儲存有關狀态對于應用程式來說是否合适的狀态資訊。
3.傳回參數是void。
public delegate void eventhandler(object sender,eventargs e);
部落格位址:
<a href="http://www.cnblogs.com/wolf-sun">http://www.cnblogs.com/wolf-sun/</a>
部落格版權:
本文以學習、研究和分享為主,歡迎轉載,但必須在文章頁面明顯位置給出原文連接配接。
如果文中有不妥或者錯誤的地方還望高手的你指出,以免誤人子弟。如果覺得本文對你有所幫助不如【推薦】一下!如果你有更好的建議,不如留言一起讨論,共同進步!
再次感謝您耐心的讀完本篇文章。http://www.cnblogs.com/wolf-sun/p/3293146.html