C#中的委託 Delegate

來源:互聯網
上載者:User

標籤:

1. 委託類似與 C或C++中的函數指標,但委託是 物件導向的,並且是型別安全的

    詳情可查看官方文檔:https://msdn.microsoft.com/en-us/library/ms173172.aspx

2. 委託 就相對與 一類方法 (即方法類,或者方法介面)

         而這一類方法都具有相同的 修飾符、形參以及 傳回值類型

    2.1. 委託 既是方法:

               聲明委託的方式如下:在修飾符後加上 delegate [‘d?l?ɡ?t]關鍵字

public delegate void Del(string message);

           從格式上看,它與方法的聲明極為相似,就是多了個 delegate關鍵字而已

              表示聲明了一類,修飾符為public、一個string類型形參的、沒有傳回值的方法

     2.2. 但 委託 不是普通的方法,因為 它也是類,

            所以委託只能聲明,而不能定義,如不能這樣寫:

private delegate void Doing(string name){      System.Windows.MessageBox.Show();}

  2.3. 執行個體化委託,調用委託

 //聲明一個void, 形參是string的委託public delegate void Del(string name);//定義個個cut方法public void cut(string name){       System.Windows.MessageBox.Show("fuck " + name);}//執行個體化委託,傳的參數是一個方法的名字,這裡是cutDel a = new Del(cut);a("CCC");//調用委託,相當於調用cut("CCC");

3. 委託 有什麼用,搞這麼複雜有什麼意思

    3.1. 將方法名作為方法參數傳遞,提高代碼的多變性和靈活性,如下:

public delegate void SayHello();public void SayInEnglish(){      toSay = "Hello";}public void SayInChinese(){      toSay = "你好";}public void HelloToSomebody(SayHello say){//將方法作為參數來傳遞      say(toSay);      System.Windows.MessageBox.Show(toSay);}

      以及:

       public delegate void Save(string word);        public void SaveTime(string str)        {              string abc = "abc";              System.Windows.MessageBox.Show("我做我的事情 "+str);//WPF        }        public void SaveNothing(string str)        {              System.Windows.MessageBox.Show("沒事可做啊 "+str);        }        public void HelloToSomebody(Save save)        {              save("試一試");        }        public static void main(string[] args){               Save s = new Save(SaveTime);               Save s2 = new Save(SaveNothing);               HelloToSomebody(s);               HelloToSomebody(s2);        }/////////////////////////////////        結果是:    我做我的事情 試一試                        沒事可做啊 試一試

4. 委託 的多播 (Multicasting of a Delegate) "+="、"-="

      

using System;delegate int NumberChanger(int n);namespace DelegateAppl{   class TestDelegate   {      static int num = 10;      public static int AddNum(int p)      {         num += p;         return num;      }      public static int MultNum(int q)      {         num *= q;         return num;      }      public static int getNum()      {         return num;      }      static void Main(string[] args)      {         // 建立委託執行個體         NumberChanger nc;         NumberChanger nc1 = new NumberChanger(AddNum);         NumberChanger nc2 = new NumberChanger(MultNum);         nc = nc1;         nc += nc2;//到這裡,nc其實綁定了2個委託,調用時會按綁定的順序執行         // 調用多播         nc(5);         Console.WriteLine("Value of Num: {0}", getNum());         Console.ReadKey();      }   }}////////////////////////////////////   結果是:  Value of Num: 75

  注意:委派物件可使用 "+" 運算子進行合并。一個合并委託調用它所合并的兩個委託。只有相同類型的委託可被合并。

                                   "-" 運算子可用於從合并的委託中移除組件委託。

總結:

      1. 委託 即使 方法,又是 類(一種特殊的方法:可以方便統一調用;特殊的類,能當方法來用的類,這也夠特殊了吧),委託是一類方法

      2. 委託 先聲明,後執行個體化,然後才能調用,委託的參數 是一個方法名

      3. 委託的 多調 "+=" , 相反操作 "-="

      4. 委託 主要用於事件 還有回呼函數中····

      

      

  

參考:http://www.runoob.com/csharp/csharp-delegate.html

 

    

C#中的委託 Delegate

聯繫我們

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