黑馬程式員:委託與事件

來源:互聯網
上載者:User

---------------------- ASP.Net+Android+IO開發S、.Net培訓、期待與您交流! ----------------------

委託就是以方法做參數進行傳遞,它定義的是方法的架構,如果用這個委託,所聲明的方法就必須按照給定的參數及返滬類型進行處理。

聲明委託的方式:delegate 傳回值類型 委託類型名(參數) 比如delegate void StringProcess(string s); 注意這裡的除了前面的delegate,剩下部分和聲明一個函數一樣,但是StringProcess不是函數名,而是委託類型名 

儲存什麼樣的方法就聲明什麼類型(方法參數與傳回值)的委託。
聲明的委託是一種類型,就像int、Person一樣,如果要用的話還要聲明委託類型的變數,聲明委託類型變數的方式:StringProcess f1;
將委託類型變數指向函數 StringProcess sp = new StringProcess(SayHello),這樣就可以像調用普通函數一樣把sp當成函數用了。委託可以看做是函數的指標。整數可以用整數變數指向它,對象可以用物件變數指向它,函數也可以用委託變數指向它。和直接調用函數的區別:用委託就可以指向任意的函數,哪怕是之前沒定義的都可以,而不使用受限於那幾種。

將委託類型變數指向函數還可以簡化成StringProcess sp = SayHello,編譯器幫我們進行了new。但是不能sp=PrintIt(),因為這樣就成了函數調用。

例子: //1定義委託類型
        delegate void DGSayHi(string name);
        //2聲明委託類型對象
        DGSayHi dgSayHi = null;
        //2.1聲明一個 與 DGSayHi委託類型有相同 簽名的方法
        void SayNiHao(string name2)
        {
            MessageBox.Show("您好啊~~~" + name2);
        }
        //2.2聲明一個 與 DGSayHi委託類型有相同 簽名的方法
        void SayHi(string name2)
        {
            MessageBox.Show("Hi~~~" + name2);
        }
        //2.3聲明一個 與 DGSayHi委託類型有相同 簽名的方法
        void SayJpa(string name2)
        {
            MessageBox.Show("OHaU~~~" + name2);
        }
        //2.4聲明一個 與 DGSayHi委託類型有相同 簽名的方法
        void SayKor(string name2)
        {
            MessageBox.Show("AniASaiU~~~" + name2);
        }

        private void btnTest_Click(object sender, EventArgs e)
        {
            //3執行個體化 委派物件
            dgSayHi = new DGSayHi(SayNiHao);
            //3.1向委派物件中追加了一個方法
            dgSayHi += SayHi;
            //上句代碼 實際執行 如下
            //dgSayHi = (DGSayHi) Delegate.Combine(dgSayHi, new DGSayHi(SayHi));

            //4聲明一個新的委派物件
            DGSayHi dgSayHi2 = new DGSayHi(SayJpa);
            dgSayHi2 += SayKor;
            //5將新委派物件 追加到 原來的委派物件中
            dgSayHi += dgSayHi2;
            //6.從委託中移除方法
            dgSayHi -= SayJpa;
            //dgSayHi = (DGSayHi) Delegate.Remove(dgSayHi, new DGSayHi(SayJpa));
            //調用委派物件
            dgSayHi("Lily");
            //dgSayHi.Invoke("Lucy");

delegate:

使用Delegate的時候很多時候沒必要使用一個普通的方法,因為這個方法只有這個Delegate會用,並且只用一次,這時候使用匿名方法最合適。
匿名方法就是沒有名字的方法。3就是沒有名字的int對象。3+5就是兩個匿名int對象的相加,允許匿名對象,就允許匿名方法。
 ProcessWordDelegatep = delegate(string s)
            {
                Console.WriteLine(s);
            };
知道C#中有匿名方法,看到這種寫法知道是匿名函數即可。

多播委託

delegatevoidProcessWordDelegate(strings)
ProcessWordDelegated = new ProcessWordDelegate(SayHello)+newProcessWordDelegate(ToLower)
多播委託如何處理傳回值?
•委託綁定多個方法後,其中一個方法執行發生異常後面的方法還會繼續執行嗎?不會!
•一個重要的方法GetInvocationList();//返回一個Delegate[]類型。Delegate類是一個抽象類別,是所有委託的父類。
組合的委託必須是同一個類型
相當於建立了一個按照組合的順序依次調用的新委派物件。
委託的組合一般是給事件用的,用普通的委託的時候很少用

事件:

事件文法:event ProcessWordDelegate 例子 OnInt
加了event關鍵字實現事件機制的好處:用了event事件,不可以修改事件已經註冊的值;不可以冒充進行事件通知了。在IntUC類外部就不能通過OnInt(3)的方式調用註冊的委託了。只能+=、-=!

委託與事件的區別

委託和事件沒有可比性,因為委託是類型,事件是對象(可以理解為對委託變數的封裝。d),下面說的是委託的對象(用委託方式實現的事件)和(標準的event方式實現)事件的區別。事件的內部是用委託實現的。(舉例子:三種實現事件方式的區別)
因為對於事件來講,外部只能“註冊自己+=、登出自己-=”,外界不可以登出其他的註冊者,外界不可以主動觸發事件,因此如果用Delegate就沒法進行上面的控制,因此誕生了事件這種文法。add、remove。
事件是用來閹割委託執行個體的。事件只能add、remove自己,不能賦值。事件只能+=、-=,不能=、不能外部觸發事件。

總結:

委託的作用:
佔位,在不知道將來要執行的方法的具體代碼時,可以先用一個委託變數來代替方法調用(委託的傳回值,參數列表要確定)。在實際調用之前,需要為委託賦值,否則為null。
事件的作用:
事件的作用與委託變數一樣,只是功能上比委託變數有更多的限制。(比如:1.只能通過+=或-=來Binder 方法(事件處理常式)2.只能在類內部調用(觸發)事件。)
在自訂控制項(自己編寫控制項的時候,會大量用到.編寫控制項的時候,會寫一些事件。但是當這些事件 被觸發以後,具體執行的那些事件處理常式是編寫控制項的人沒法確定的。這個時候只能通過事件來佔位(調用),具體調用的是哪個方法,由使用控制項的人來決定(Click+=new 委託(方法名);))

---------------------- ASP.Net+Android+IOS開發、.Net培訓、期待與您交流! ----------------------

詳細請查看:http://edu.csdn.net

聯繫我們

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