一、委托是什麼? 委托一般可以看作是持有一個或多個方法的對象。可以把委托看做是對象,其和我們使用一個對象的過程一樣。 聲明->創建委托對象->給委托賦值->調用委托。 關於委托還有另一種理解,我們可以把委托類比為C/C++中的函數指針這一概念。只是委托是類型安全的。函數指針就是 指向函數入口地址的一 ...
一、委托是什麼?
委托一般可以看作是持有一個或多個方法的對象。可以把委托看做是對象,其和我們使用一個對象的過程一樣。
聲明->創建委托對象->給委托賦值->調用委托。
關於委托還有另一種理解,我們可以把委托類比為C/C++中的函數指針這一概念。只是委托是類型安全的。函數指針就是
指向函數入口地址的一個地址變數。我們可以隨便更改指針指向的地址,以達到對不同函數的調用。同樣我們可以更改委托的賦值
方法可以執行不同的方法。
函數指針特別適合用於回調函數,可以在函數執行時再判斷函數指針指向的函數。委托也可以在執行的時候再決定指向哪一個方法。
使用委托的實例:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DelegateDemo { delegate void MyDel(int value); class Program { void PrintLow(int value) { Console.WriteLine("The low value is {0}", value); } void PrintHigh(int value) { Console.WriteLine("The high value is {0}", value); } static void Main(string[] args) { Program program = new Program(); //MyDel del; Action <int> del = null; Random random = new Random(); int randomValue = random.Next(99); if (randomValue < 50) { //del = delegate (int x) // { // Console.WriteLine("Low value{0}", x); // }; del =(int x)=> { Console.WriteLine("Low value:{0}", x); }; //del = x => { }; //匿名方法+Lambda表達式 } else { del = delegate (int x) { Console.WriteLine("High value{0}", x); }; } del(randomValue); Console.ReadKey(); } } }
二、泛型委托
CLR環境中給我們內置了幾個常用委托Action、 Action<T>、Func<T>、Predicate<T>,一般我們要用到委托的時候,儘量不要自己再定義一 個委托了,
就用系統內置的這幾個已經能夠滿足大部分的需求,且讓代碼符合規範。
例如上面代碼的兩種定義:public delegate void MyDel(int x) ; //自己定義的一種委托類型,返回值為void,一個int類型參數,
其實系統已經幫我們定義了。我們完全可以採用 Action <T> 泛型來定義: Action <int> del = null 。
其餘也類似,關於返回值。
三、匿名方法
上面的代碼既有關於匿名方法的介紹也有Lambda表達式的一般使用方式。
MyDel del = delegate (int x){ Console.WriteLine(""); };
MyDel del = x => x + 1 ;