標籤:
做項目一段時間,經常用到委託和一些Lambda運算式,在這裡也對這些東西總結一下。
1.什麼是委託?
說實在的,用了這麼多,突然讓說一下委託的定義,確實還有難度。在我看來,委託跟平常的方法差不多,但是功能卻十分的強大。強大到什麼地方呢?方法中可以有參數,委託既然類似於方法,所以也有參數,但是參數的內容可以是方法。
2.委託用法
委託在用法上與類的用法又特別的相同,比如在使用某個類的時候,必須先進行執行個體化。下面看一個Demo
<span style="font-family:SimSun;font-size:18px;">namespace ConsoleApplication1{ public class B { //定義一個委派物件 //因為委託中傳入的是方法,在此委託就好比是一些方法的模型 //比如這時定義的一個委託,就要求傳入的方法傳回值是void //參數必須是一個string類型的字串 delegate void Test(string name); //測試方法一 public static void Test1(string name) { Console.WriteLine(name); } //測試方法二 public static void Test2(string age) { Console.WriteLine(age); } //使用委託 static void Main(string[] args) { //使用委託 //用法與類相似,用前必須先執行個體化一個委派物件 Test test = new Test(Test1); //通過執行個體化後,該委託就成為了方法的一個代理 test("校長"); Console.ReadLine(); } }}</span>
小結:通過上述代碼,我們也看到,在用法上委託與類相似,在功能上與方法相似。
3.匿名委託
看了上述的代碼,基本上算是對委託有了初步的理解,只要掌握以下用法即可。下面來看一下,匿名委託,與委託一樣,只不過變了一下模樣而已。
<span style="font-family:SimSun;font-size:18px;"> public class C { static void Main(string[] args) { //以前用的時候還需要執行個體化,現在又了匿名的委託 //不用再執行個體化委派物件了 //採用Lambda運算式書寫的一個匿名委託 DelCompare del = (t1, t2) => { return t1+t2; }; //直接匿名委託 DelCompare del1 = delegate(int t1,int t2) { return t1+t2; }; //調用委託方法 int n = del(3, 4); int n1 = del1(3, 4); } }</span>
上述代碼只不過是在委託的基礎上,變了一下型而已。到底,通過上述兩次代碼展示,我們已經知道用委託的方法已經有三種形式了。
4.非同步委託
小編在學習委託的時候,看了一下MSDN文檔,發現了一個好東西。非同步委託。
BeginInvoke 方法:在建立控制項的基礎控制代碼所線上程上非同步執行指定委託。
具體的實現原理,也不是很清楚,但是看到非同步執行指定委託,小編就有點興奮了。於是小編那這個方法執行委託,與上述進行的對比,發現能夠快上1000倍。什麼都不說了,直接上代碼吧!
<span style="font-family:SimSun;font-size:18px;"> delegate void DelTest(); public class D { //回呼函數,當非同步委託的方法執行完畢之後調用的方法 public static void Callback(IAsyncResult ar) { Console.WriteLine("OVER"); } static void Main(string[] args) { //執行個體化委派物件 DelTest del = Test; //委託的非同步呼叫 del.BeginInvoke(Callback, null); Console.WriteLine("測試"); } public static void Test() { Console.WriteLine("測試"); } }</span>
5.Action<T> 委託和Func<T,TResult> 委託
貼心的微軟,真的是為人民服務哈。看看上面我們用委託的繁瑣的過程,於是微軟基於這點考慮,給我們封裝了兩個函數。
Func<T,TResult> :封裝一個具有一個參數並返回TResult 參數指定的類型值的方法。
Action<T>:封裝一個方法,該方法只有一個參數並且不返回值。
這兩者的區別就是在於有沒有返回值,具體的執行個體,可以參考MSDN,在此就略微的提一下。
C#中的委託