C#中的委托 Delegate(委托 也叫代表,代表一類方法)


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);
}
//實例化委托,傳的參數是一個方法的名字,這里是cut
Del 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.tracefact.net/csharp-programming/delegates-and-events-in-csharp.aspx    

  

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

 

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM