學習C#委託與事件

來源:互聯網
上載者:User

學習參考資料:
  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 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.