學習參考資料:
MSDN:ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconprovidingeventfunctionality.htm
CodeProject: http://www.codeproject.com/csharp/events.asp
幾天來參照MSDN上的委託事件的例子,自已寫了一個關於委託的事件。例子很簡單,但也能說明關於委託與事件是個什麼東西吧。
委託,功能就相當於C/C++中的函數指標。可以用定義的委託來調用所指向的函數。
先聲明一個簡單的委託:
//聲明委託:
public delegate void DeFunction(int a,int b);
//函式宣告:
public void Swap(int a,int b)
{
//.
}
//建立一個委託引用,以指向相應的函數。
DeFunction defun;
defun=new Defunction(Swap);
//使用委託來代替函數的調用
defun(3,4); //實際上是調用的Swap(3,4)
OK,究竟委託在.net中發揮了什麼用處?答案是:可以用於事件。
事件,就是在程式中發生某些情況,需要被相應的函數來處理,比如按紐被按下(Button click)就是一事件,調用到某個函數來處理這個情況。關鍵的關鍵是:Button是一個類,它的所有函數都已被封裝好,已經不可能再在類中添加相應的函數來處理這個Button被按下究竟該怎麼處理。難道像下面這樣嗎?
class Button
{
..
public Button_Click(object sender,EventArgs e)
{
//處理Button被按下的代碼,需要在這裡更改Button被按下的代碼
}
public click()
{
//告訴這個Button類什麼情況下是被按下的,然後調用Button_Click來處理之
//比如,當滑鼠在這個Button下按這個按紐時,當Button有交點並按Enter時。都表示滑鼠被按 下。
Button_Click();
}
}
這樣多不實用,多不現實啊。所以,只能想另外的辦法...比如可以讓Button_Click變成虛擬函數,然後。添加Button時繼承這此Button,然後改寫這個函數。但也有一個問題,就是我想讓處理按紐被按下時的函數是自訂的,比如MyButton_Click,這樣子就沒有辦法了。
如果用委託來做會是什麼樣的情況?
首先,要定義一個委託。
public delegate void MyEventHandle(object sender,EventArgs e);
注意,在事件中用委託一般命名為EventHandle.
然後,在Button類中可以這樣表示:
public class Button
{
public MyEventHandle buttonclick; //委託類型
public virtual void OnClick(EventArgs e)
{
if(buttonclick!=null)
buttonclick(this,e); //注意,在定義button類的時候,還不知道這個委託會掛到哪個函數上面去,但是肯定會掛到某個函數上面去。
}
public void click()
{
EventArgs e = new EventArgs(); //這裡是事件參數類型,是一個類,可以派生此類,做個自訂的參數集。
OnClick(e);
}
}
這樣的類定義好了,那麼我們用它的時候就簡單多了。不需要往裡改寫任何裡面的東西,只要添加我們想要的函數就好了。
在我們的(用戶端)上。
1.寫Button被按下時處理的函數,函數隨便怎麼命名都可以。public class DoButton
{
public void MyButton_Click(object sender,EventArgs e)
{
//這裡寫上我們要寫的處理內容即可,sender就是Button的對象實體。
//.
}
}
2.掛鈎,把上面的函數與Button類中的委託掛起來 Button bt = new Button();
DoButton dobutton = new DoButton();
bt.buttonclick += new MyEventHandle(dobutton.MyButton_Click); //已與Button中的委託掛鈎了
//下面,如果發生click事件,就可以調用我們寫的MyButton_Click函數了。
bt.click();
寫的範例程式碼:http://files.cnblogs.com/shipfi/MyEventSamle.rar