Linq Lamda演變歷史

2022-03-05 22:11:12 字數 3929 閱讀 4418

一..netframework 1.0  1.1時代

以前學習委託,大部分流程都是在這裡宣告委託,例項化的時候不得不宣告乙個方法,在寫乙個方法不得不傳進入,這個方法與宣告的委託引數返回值吻合,然後把這個方法傳遞進去。

namespace

lamdahistory

private

static

void

donothing()

private

static

void study(int id, string

name)

學習.net高階班");}}

}

如下圖所示委託編譯後從il層面看就是乙個密封的,且其繼承自multicastdelegete的類

二.netframework 2.0

2.1.不在像以前老老實實寫方法名稱,而是把方法體直接寫在例項化委託這裡了,前面加關鍵字delegate,匿名方法沒有名字

2.2.可以訪問區域性變數age,如果像1.0時代,是個方法的話,沒有辦法訪問到區域性變數age

namespace

lamdahistory

); method.invoke();

noreturnwithpara method2 = new noreturnwithpara(delegate(int id,string

name) 學習.net高階班");

});method2.invoke(

123, "

董小姐"

); }}}

三..netframework3.03.1.把delegate關鍵字去掉,增加了乙個箭頭,箭頭念goes to,這就是lamda表示式引數列表=>方法體

amespace lamdahistory

); method.invoke();

noreturnwithpara method2 = new noreturnwithpara((int id,string name) => 學習.net高階班");

});method2.invoke(

123, "

董小姐"

);

//省略引數型別int和string,編譯器的語法糖,雖然沒寫,編譯時還是有的,

//根據委託推算的,因為noreturnwithpara這個委託就是就是接收乙個int和string

noreturnwithpara method3 = new noreturnwithpara((id, name) => 學習.net高階班");

});method3.invoke(

456, "

張小姐"

);

//如果方法體只有一行,可以去掉大括號和分號

noreturnwithpara method4 = new noreturnwithpara((id, name) =>console.writeline($

" 學習.net高階班")

);method4.invoke(

789, "

王小姐"

);

//new noreturnwithpara委託可以省掉,也是語法糖,編譯器自動加上

noreturnwithpara method5 = (id, name) =>console.writeline($

" 學習.net高階班");

method5.invoke(

101, "

楊小姐"

); }}}

3.2.省略引數型別int和string,編譯器的語法糖,雖然沒寫,編譯時還是有的,根據委託推算的,因為noreturnwithpara這個委託就是就是接收乙個int和string

noreturnwithpara method3 = new noreturnwithpara((id, name) =>   學習.net高階班");

});method3.invoke(

456, "

張小姐");

3.3.如果方法體只有一行,可以去掉大括號和分號

//

如果方法體只有一行,可以去掉大括號和分號

noreturnwithpara method4 = new noreturnwithpara((id, name) =>console.writeline($

" 學習.net高階班")

);method4.invoke(

789, "

王小姐");

3.4.new noreturnwithpara委託也可以省掉,也是語法糖,編譯器自動加上

//

new noreturnwithpara委託可以省掉,也是語法糖,編譯器自動加上

noreturnwithpara method5 = (id, name) =>console.writeline($

" 學習.net高階班");

method5.invoke(

101, "

楊小姐");

四.lamda表示式是什麼?

4.1.lamda不是乙個委託,因為編譯器語法糖省略了new noreturnwithpara,所以只是看起來像是1個委託,但是實際上從上面可以看出lamda只是例項化委託的乙個引數,lamda就是個匿名方法。

4.2.從il層分析,lamda是匿名方法,但是編譯的時候會分配乙個名字,還會產生乙個私有sealed類,這裡增加乙個方法,這個方法就是跟lambda表示式一一對應的。

五.lamda在多播委託中的特點-無法移除

lamda表示式在多播委託為什麼加1次,減1次,為什麼減不掉呢?多播委託裡面的lamda無法移除,雖說兩個lamda的方法內容一樣,lamda是匿名方法,但是編譯器編譯後會自動給分配方法名字,其實是2個不同的方法,所以無法移除,而study是同1個方法,所以可以移除。

namespace

lamdahistory

學習.net core

"); };

method -= this

.study;

method -= (id, name) => 學習.net core

"); };

method.invoke(

123, "張三"

); }

private

void study(int id, string

name)

學習.net framework");}}

Unix作業系統的歷史演變

unix簡介 ken和dennis最早是在貝爾實驗室開發unix的,此後的10年,unix在學術機構和大型企業中得到了廣泛的應用,當時的unix擁有者at t公司以低廉甚至免費的許可將unix原始碼授權給學術機構做研究或教學之用,許多機構在此原始碼基礎上加以擴充和改進,形成了所謂的unix 變種 v...

從演變歷史,看透本質 查詢演算法以及紅黑樹

二分查詢 前提是有序,且靜止不變。我們使用有序陣列儲存鍵,經典的二分查詢能夠根據陣列的索引大大減少每次查詢所需的比較次數。在查詢時,我們先將被查詢的鍵和子陣列的中間鍵比較。如果被查詢的鍵小於中間鍵,我們就在左子陣列中繼續查詢,如果大於我們就在右子陣列中繼續查詢,否則中間鍵就是我們要找的鍵。一般情況下...

git學習(四)重新命名檔案和檢視版本演變歷史

git reset hardgit mv 1.txt 1.md 檢視現在的工作區的狀態,看到renamed 1.txt 1.md 1.git log命令 2.git log oneline命令 簡潔 git log oneline git版本演變歷史 簡潔 git log n4 oneline 最近...