天天看點

.Net——委托

 對于初學者,委托是很容易讓人暈的,一是暈它如何起作用,二是暈它有什麼用。

最近回過頭來又看了下委托,又有些不同的感覺,寫之自用。

聲明方面,委托可以被聲明在類内,也可以與類同級,并且聲明時沒有方法體:

public delegate void NoReturn(int id, string name);      

然後我們需要準備一個具有被實作的方法(有方法體),這裡我随便寫一個:

public static void showStudent(int id, string name)
{
    Console.WriteLine("{0}正在練習,學号是{1}", name, id);
}
      

接着就是調用了,委托調用是這樣的:

NoReturn nr = new NoReturn(showStudent);
//第二種執行個體方法:NoReturn nr = showStudent;
 nr.Invoke(15578, "小明");//調用
      

運作效果:

.Net——委托

如上所述,執行個體可以直接傳入方法名(取消new)。調用關鍵詞是Invoke,這點要記清。

接下來還要再說點基于委托的變種,Func<T>和Action。

先說Action吧,我們單擊進去以後,會看到這些:

.Net——委托

我們看到該類型會傳回一個delegate,這代表什麼呢?代表我們在需要使用委托時,直接使用Action即可,無需和上面一樣顯示聲明一個delegate了。

下面做一個Action的小案例:

Action ac = () => Console.WriteLine("使用Action");
 ac.Invoke();
 Action<int> ac2 = i => Console.WriteLine("使用Action<T>,傳入了{0}", i);
 ac2.Invoke(1);      

運作後:

.Net——委托

有些同學一定發現我使用了 ()=> ,光看這個可能會暈,但是我說它是lambda表達式大家應該就秒懂了,不明白的我科普下:

() => 

上面的括号是參數清單, => 後面的是方法體。

Action,它既無法傳參,也無法傳回值,但是Action<T>可以傳參,同樣無法傳回值。實際使用中一定要注意了。

但是我們非要使用帶傳回值的委托要如何呢?用Func<T>就好啦~~

我們先來看下Func<T>的定義:

.Net——委托

它擁有17個重載(你沒聽錯,就是17個),最多允許傳入16個參數,并且傳回1個參數,最少也要有一個傳回參數。

有些機智的童鞋一定想說,這家夥和Action的差距就是有沒有傳回值而已嘛~

對的,實際上就這麼點差距而已,先簡單寫個調用:

Func<int, int> fc = a => a * a;
Console.WriteLine(fc.Invoke(6));
Func<int, int, int> fc2 = (a,b) => a * b;
Console.WriteLine(fc2.Invoke(6,5));
      

這裡呢我寫了2參和3參,更多參的也是一樣,<>内帶出參數永遠是最後一個,然後在lambda表達式内,你想使用參數清單内的參數隻需要起個名字即可(我這裡是a和b)。

.Net——委托

委托和它的變形至此已經介紹完畢,歡迎大家提問、讨論~

聲明:未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則視為侵權。

本文原創發表于部落格園,作者為暮城傾心。歡迎轉載。Donation(掃碼支援作者)↓

.Net——委托
微信
.Net——委托
支付寶
Net

繼續閱讀