在我這菜鳥理解上,委托就是可以用方法名調用另一方法的便捷方法,可以簡化switch等語句的重復。最近做項目的時候恰好需要用到委托,便來復習及學習委托的使用。嗯...本人以前並沒有用過,只是稍微知道而已。以下是整理的筆記。
一.委托的概念
委托是用戶自定義的類,它定義了方法的類型。儲存的是一系列具有相同參數和返回類型方法的地址列表,調用委托時,此委托列表的所有方法都將被執行。
二.委托類型的定義
委托類型必須在被用來創建變量以及類型對象之前聲明。
委托類型的聲明:
1.以delegate關鍵字開頭。
2.返回類型+委托類型名+參數列表
delegate void MyDel(int a)
三.實例
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(); } } }
結果如下圖:
那么有時候我們需要返回每個方法的結果,此方法就不適用了,那怎么才能實現每個方法的返回結果都可以獲取到呢?后續再寫了。今天就簡單的介紹了委托的基本概念和使用。
五、泛型委托
泛型的委托,就是然參數的類型不確定,例如代碼改寫為:
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
泛型的詳細內容不屬於本文的介紹范圍,這里不加多說了。