c#委託與事件 心得

來源:互聯網
上載者:User
c#用委託來實現事件通知機制。委託相當與c++函數指標。整個過程涉及一個呼叫者,一個被呼叫者,還有就是這個委託。

- 實現步驟

有以下幾步: 1. 申明委託, 2.定義呼叫者和調用的函數, 3.定義被呼叫者和具體實現的函數(被調用的函數)

1.申明委託 ,在包裡或者類裡,public
 public delegate void PlayGame(Object sender, EventArgs e); 

2.定義呼叫者(類LetsGame)和調用委託的函數,在呼叫者裡要有委託的執行個體(呼叫者扔出一個委託,被呼叫者給這個委託賦值)class LetsGame{ 
    public event PlayGame theGame; 
    public void startPlay(EventArgs e){ 
        if(theGame != null){ 
        theGame(this,e); 
    } 

3. 定義被呼叫者(類MS)和具體實現的函數(被調用的函數),也就是concrete class的實現或者叫函數指標執行個體。打個比方,在一個叫MS的類中實現.MS中對呼叫者中委託的執行個體進行賦值.class MS {
    public MS(LetsGame lg) {
        lg.theGame += new PlayGame(MSPlayGame);
    }
    public void MSPlayGame(Object sender, EventArgs e){ 
        Console.WriteLine("Who laughs the last who wins"); 
    } 
}


這樣當調用LetsGame.startPlay的時候就會調用MS.MSPlayGame.

- 實際應用

對照一下c#的GUI事件處理或者asp.net的web控制項事件處理,能幫我們更好的理解委託和事件.大家一定很熟悉asp.net裡下面的代碼private void InitializeComponent()
{    
    
    this.Button1.Click += new System.EventHandler(this.Button1_Click);
    
}

private void Button1_Click(object sender, System.EventArgs e)
{
    //do sth
}

這就是用委託來實現事件.你可能發現我們並沒有給它聲明委派物件並通過event關鍵字來引用該委派物件,那是因為asp.net早就幫我們做好了該項工
作,其委派物件是System.EventHandler.
Button1相當於上面的LetsGame的執行個體,是呼叫者,Button1_Click是被來電者法.當你click
Button1後,Button1就會調用Button1_Click.

-雜項

我覺得這種機制和design pattern裡的observer很類似,我們完全可以用observer來達到同樣的效果,但是用委託更靈活,不需要定義一個interface然後所有的concrete class都實現某個方法,函數指標(委託)更靈活.

還有,委託不一定非要和事件一起用,單獨用的時候就是函數指標.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.