C#委託理解(1)

碰碰發表於2018-03-20
# 委託 #
## 1、理解 ##
(1)委託型別用於定義和相應應用程式中的回撥;
(2)使用回撥,程式設計師可以使一個函式 返回報告給(即回撥)另一個函式;
(3)委託是型別安全的物件,它指向程式中另一個以後會被呼叫的的方法。
## 2、定義委託 ##
(1)**使用delegate關鍵字
    如:public delegate int XXX(int a,int b);
     //定義了一個(可以指向任意方法)、
     //(返回一個int型別返回值)、
     //(接收兩個int型別輸入引數)的委託型別。 
(2)當C#編譯器處理委託型別時,將自動產生一個繼承自System.MulticastDelegate的**密封類XXX**以維護以後將要呼叫方法的列表。
(3)密封類XXX定義了三個公共方法:
    public sealed class XXX : System.MulticastDelegate
    {
      //以同步方式呼叫委託物件維護的每個方法
      public int Invoke(int a,int b);

      //以非同步方式開始呼叫委託物件維護的每個方法
      public IAsyncResult BeginInvoke(int a,int b,asyncCallback cb,object state);

      //以非同步方式結束呼叫委託物件維護的每個方法
      public int EndInvoke(IAsyncResult result);
    }
## 3、委託例項 ##
    //定義部分
    public delegate int XXX(int a,int b);
    public int Add(int x,int y)
    {
      return x + y;
    }
    //以下是控制檯Main方法中的內容
    XXX d = new XXX(Add);
    Console.writeLine(d(10,11));
    //控制檯顯示結果
    21

說明:實際上d(10,11)實際上在記憶體中呼叫了Invoke()方法

# 4、泛型委託:Action<>和Func<> #
## 使用委託的三個步驟: ##
    1、自定義與方法Add匹配的委託XXX
    2、建立委託的例項:XXX d = new XXX(Add);
    3、呼叫委託物件的Invoke()方法來間接呼叫Add方法
## 使用Action<>委託: ##
    1、建立委託的例項:Action<int,int> d = new Action<int,int>(Add);
    2、呼叫委託物件的Invoke()方法來間接呼叫Add方法
缺點:Action<int,int>只能指向void返回值的方法
## 使用Func<>委託: ##
優點:相比Action<>,Func<>同時能指向void返回值的方法;Func<>的最後一個引數總是方法的返回值。
    
    1、建立委託的例項:
      Func<int,int,int> d = new Func<int,int,int>(Add);
    2、呼叫委託物件的Invoke()方法來間接呼叫Add方法:

相關文章