C#中的匿名方法是在C#2.0引入的,它終結(jié)了C#2.0之前版本聲明委托的唯一方法是使用命名方法的時(shí)代。雖然在 C# 3.0 及更高版本中,Lambda 表達(dá)式取代了匿名方法,作為編寫內(nèi)聯(lián)代碼的首選方式。但是,匿名方法的信息同樣也適用于 Lambda 表達(dá)式,可以說(shuō)Lambda 表達(dá)式就是匿名方法演變過(guò)來(lái)的,這點(diǎn)后續(xù)博文會(huì)講解推演的過(guò)程。我們可以使用匿名方法來(lái)忽略參數(shù)列表。這意味著匿名方法可轉(zhuǎn)換為具有各種簽名的委托,而這對(duì)于 Lambda 表達(dá)式來(lái)說(shuō)是不可能的。學(xué)好匿名方法,才能更加深刻地理解好Lambda 表達(dá)式。
在說(shuō)匿名方法的使用之前,先來(lái)說(shuō)說(shuō)匿名方法的其他叫法。匿名方法也有人叫匿名委托、匿名函數(shù),雖然現(xiàn)在普遍通用,但是還是有點(diǎn)區(qū)別的。msdn官網(wǎng)上說(shuō):要將代碼塊傳遞為委托參數(shù),創(chuàng)建匿名方法則是唯一的方法。這里的匿名方法就是官方的說(shuō)法,而因?yàn)槟涿椒ň褪菫榱藢⒋a塊傳遞為委托參數(shù),因此也有人叫匿名委托,包括筆者也喜歡這種稱呼,我覺(jué)得這樣叫通俗易懂。至于匿名函數(shù),因?yàn)镃#中“方法”(Method)的概念有些語(yǔ)言叫“函數(shù)”(Function),因此匿名方法也被人叫做匿名函數(shù)。然而在msdn文檔介紹中匿名函數(shù)包括了Lambda 表達(dá)式和匿名方法,可以說(shuō)匿名函數(shù)是更高的一級(jí),所以說(shuō)最官方的叫法還是匿名方法,當(dāng)然其他的叫法流傳也甚廣,聽得懂就行了,沒(méi)必要糾結(jié)。
接下來(lái)說(shuō)說(shuō)匿名方法的寫法規(guī)則,先上例子:
delegate(int i) { return i > 0; }它遵循這樣的格式書寫:delegate(形參表){方法體代碼},可以類比js中匿名函數(shù)的寫法來(lái)記憶。那么匿名方法運(yùn)用在哪里呢?怎么使用呢?當(dāng)你需要一個(gè)臨時(shí)方法,該方法使用次數(shù)極少或者你需要的這個(gè)方法的代碼很簡(jiǎn)短,那么你就可以使用匿名方法。給個(gè)簡(jiǎn)單的例子,如果需要在一個(gè)整型集合中篩選出符合條件的新集合,如下
List<int> list = new List<int>() { 1, 2, 3, 4, 5, 6 };//假設(shè)需要從list集合中獲取大于3的所有元素以新集合返回var newlist = newlist.FindAll(GetNewList);GetNewList()為另外定義的和委托PRedicate<T>具有同簽名的方法(Predicate<T>是系統(tǒng)內(nèi)置委托,后續(xù)博文會(huì)講)GetNewList()定義如下:
bool GetNewList(int i) { return i > 3; }以上是沒(méi)有使用匿名方法時(shí)的寫法,如果使用了匿名方法,你就會(huì)發(fā)現(xiàn)一切變得如此簡(jiǎn)便,
List<int> list = new List<int>() { 1, 2, 3, 4, 5, 6 };var newlist = list.FindAll(delegate(int i) { return i > 3; });通過(guò)對(duì)比,可以發(fā)現(xiàn)使用匿名方法能夠提供與先前命名方法相同的功能,但是它已經(jīng)不再需要一個(gè)在關(guān)聯(lián)到委托之前就明確創(chuàng)建的方法了,因此也減少了實(shí)例化委托所需的編碼系統(tǒng)開銷,這就是它的最大好處。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注