C#委托和事件學習筆記
C#語言還是比較常見的東西,這里我們主要介紹C#委托和C#事件,包括介紹NumberReachedEventHandle 僅是一個委托等方面。
在學習C#委托和C#事件過程中,我讀了許多文章來理解他們二者究竟是怎么一回事,以及如何使用他們,現在我將整個的理解過程陳述以下,我學到的每一方面,恐怕也是你們需要掌握的:
什么是C#委托?
C#委托和C#事件這兩個概念是完全配合的。委托僅僅是函數指針,那就是說,它能夠引用函數,通過傳遞地址的機制完成。委托是一個類,當你對它實例化時,要提供一個引用函數,將其作為它構造函數的參數。
每一個委托都有自己的簽名,例如:Delegate int SomeDelegate(string s, bool b);是一個委托申明,在這里,提及的簽名,就是說SomeDelegate 這個委托 有 string 和 bool 類型的形參,返回一個int 類型。
上面提及的:當你對委托實例化時,要提供一個引用函數,將其作為它構造函數的參數。這里要注意了:被引用的這個函數必須和委托有相同的簽名。
看下面的函數:
- private int SomeFunction(string str, bool bln){...}
C#事件的理解
我們知道,在C#中:
◆按鈕(Button)就是一個類,當我們單擊它時,就觸發一次click事件。
◆時鐘(Timer)也是一個類,每過一毫秒,就觸發一次tick事件。
現在有一個Counter的類,它有一個方法 CountTo(int countTo, int reachableNum),該方法表示:在指定的時間段內(0~~countTo),當到達指定的時間點reachableNum時,就觸發一次NumberReached事件。
它還有一個事件:NumberReached,C#事件是委托類型的變量。意思是:如果給事件命名,用event關鍵字和要使用的委托類型申明它即可,如下所示:
- public event NumberReachedEventHandler NumberReached;
在上面的申明中,NumberReachedEventHandle 僅是一個委托,更確切的表示應該是:NumberReachedDelegate。但是微軟從不這樣認為MouseDelegate或者PaintDelegate,而是稱謂:MouseEventHandler 或者 PaintEventHandler。所以
NumberReachedEventHandler 比NumberReachedDelegate聽起來更方便一些,OK?好了,讓我們繼續,現在你知道了,在我們聲明事件之前,需要象下面這樣的形式來定義委托:
- public delegate void NumberReachedEventHandler(object sender, NumberReachedEventArgs e);
現在聲明的C#委托 NumberReachedEventHandle,它有一個void 返回值,和object,NumberReachedEventArgs兩個形參。就像我們在***節中強調的那樣,當實例化委托時,作為實參傳入的函數也必須擁有和委托同樣的簽名。
在你的代碼中, 你是否用過PaintEventArgs 或者 MouseEventArgs來確定鼠標的移動位置?是否在觸發Paint事件的對象中用過Graphics 屬性?實際上,為用戶提供數據的類都是繼承于System.EventArgs類,就是我們常說的事件參數類,如果事件不提供參數,就不定義該類。在我們的例子中,我們通過下面的類提供預期的時間點。
- public class NumberReachedEventArgs : EventArgs
- {
- private int _reached;
- public NumberReachedEventArgs(int num)
- {
- this._reached = num;
- }
- public int ReachedNumber
- {
- get{
- return _reached;
- }
- }
- }
【編輯推薦】