在我這菜鳥理解上,委託就是能夠用方法名調用另外一方法的便捷方法,能夠簡化switch等語句的重複。最近作項目的時候剛好須要用到委託,便來複習及學習委託的使用。嗯...本人之前並無用過,只是稍微知道而已。如下是整理的筆記。學習
一.委託的概念spa
委託是用戶自定義的類,它定義了方法的類型。儲存的是一系列具備相同參數和返回類型方法的地址列表,調用委託時,此委託列表的全部方法都將被執行。code
二.委託類型的定義對象
委託類型必須在被用來建立變量以及類型對象以前聲明。blog
委託類型的聲明:string
1.以delegate關鍵字開頭。it
2.返回類型+委託類型名+參數列表io
delegate void MyDel(int a)
三.實例class
1)如今咱們先建立了控制檯程序,進行簡單的實例泛型
namespace Func { public delegate void MyDel();//聲明一個自定義委託 class Program { static void Main(string[] args) { MyDel say1 = SayHi; MyDel say2 = new MyDel(SayHi); say1(); say2(); } static void SayHi() { Console.WriteLine("hi"); } } }
2)擴展實例
namespace Func { public delegate int MyDel(int num);//聲明一個自定義委託 class Program { static int Add1(int a) { int b = 10 + a; Console.WriteLine("——Add1———"); return b; } static int Add2(int a) { int b = 10 - a; Console.WriteLine("——Add2———"); return b; } static void Calculate(MyDel ex, int a) { var result = ex(a); Console.WriteLine(result + "\n"); } static void Main(string[] args) { Calculate(Add1, 1); Calculate(Add2, 10); Console.ReadKey(); } } }
結果以下圖
上面實現了「把方法看成參數在另外一個方法中傳遞或調用」;從上面能夠看出,調用的方法和委託的返回類型,參數類型都必須一致。
我咱們能夠把委託做爲參數傳遞給封裝好了的方法,經過委託來動態的調用方法。
四.委託的加減運算
能夠使用+=運算符,爲委託新增方法。
一樣能夠使用-=運算符,爲委託移除方法。
當委託列表中有幾個方法時,調用委託時,則會依次通過各個方法,並返回列表最後一項方法的結果。
namespace Func { public delegate int MyDel(int num);//聲明一個自定義委託 class Program { static int Add1(int a) { int b = 10 + a; Console.WriteLine("——Add1———"); return b; } static int Add2(int a) { int b = 10 - a; Console.WriteLine("——Add2———"); return b; } static void Calculate(MyDel ex, int a) { var result = ex(a); Console.WriteLine(result + "\n"); } static void Main(string[] args) { //Calculate(Add1, 1); //Calculate(Add2, 10); MyDel myDel = Add1; myDel += Add2; Calculate(myDel, 10); Console.ReadKey(); } } }
結果以下圖:
那麼有時候咱們須要返回每一個方法的結果,此方法就不適用了,那怎麼才能實現每一個方法的返回結果均可以獲取到呢?後續再寫了。今天就簡單的介紹了委託的基本概念和使用。
5、泛型委託
泛型的委託,就是然參數的類型不肯定,例如代碼改寫爲:
using System; using System.Collections.Generic; using System.Text; namespace TestApp { /// <summary> /// 委託 /// </summary> /// <param name="s1"></param> /// <param name="s2"></param> /// <returns></returns> public delegate string ProcessDelegate<T,S>(T s1, S s2); class Program { static void Main(string[] args) { /* 調用方法 */ ProcessDelegate<string,int> pd = new ProcessDelegate<string,int>(new Test().Process); Console.WriteLine(pd("Text1", 100)); } } public class Test { /// <summary> /// 方法 /// </summary> /// <param name="s1"></param> /// <param name="s2"></param> /// <returns></returns> public string Process(string s1,int s2) { return s1 + s2; } } }
輸出的結果就是:Text1100泛型的詳細內容不屬於本文的介紹範圍,這裏不加多說了。