<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
從C#3.0開始,可以使用lambda表示式把實現程式碼賦予委託。lambda表示式與委託(https://www.jb51.net/article/244051.htm)直接相關。當引數是委託型別時,就可以使用lambda表示式實現委託參照。
static void Main() { string mid = ", middle part,"; Func<string, string> anonDel = param => { param += mid; param += " and this was added to the string."; return param; }; Console.WriteLine(anonDel("Start of string")); }
lambda運運算元“=>” 的左邊是參數列,右邊是lambda變數的方法的實現程式碼。
如果lambda表示式只有一個引數,只寫出引數名就可以,像上面的程式碼。
如果委託使用多個引數,就需要把引數名放到括號中:
Func<double, double, double> twoParams = (x, y) => x * y; Console.WriteLine(twoParams(3, 2));
可以在括號中給變數名新增引數型別:
Func<double, double, double> twoParamsWithTypes = (double x, double y) => x * y; Console.WriteLine(twoParamsWithTypes(4, 2));
如果lambda表示式只有一條語句,在方法塊內就不需要花括號和return語句,因為編譯器會新增一條隱形的return語句。
Func<double, double, double> twoParams = (x, y) => x * y; Func<double, double, double> twoParams = (x, y) => { retrun x * y; }
如果在lambda表示式的實現程式碼中有多條語句,就必須新增花括號和return語句:
Func<string, string> anonDel = param => { param += mid; param += " and this was added to the string."; return param; };
通過lambda表示式可以存取lambda表示式塊外部的變數,這稱為閉包。閉包是一個很好的功能,但如果使用不當,會很危險。例如:
int someVal = 5; Func<int,int> f = x => x+someVal;
假定以後修改了變數someVal,於是呼叫委託f時,會使用someVa的新值:
someVal = 7; f(3);//結果為10而不是8.
特別是,通過另一個執行緒呼叫lambda表示式時,我們可能不知道進行了這個呼叫,也不知道外部變數的當前值是什麼。
所以在使用閉包時,一定要謹慎!!!
在lambda表示式存取lambda表示式塊外部的變數時,編譯器在定義lambda表示式時,編譯器會建立一個匿名類,它用一個建構函式來傳遞外部變數。該建構函式取決於從外部傳遞進來的變數個數和型別。
對於lambda表示式Func<int,int> f = x => x+someVal;
public class AnonymousClass { private int someVal; public AnonymousClass(int someVal) { this.someVal = someVal; } public int AnonymousMethod(int x) { retrun x+someVal; } }
使用lambda表示式並呼叫該方法的時,會建立匿名類的一個範例,並傳遞呼叫該方法時變數的值。
先看下面這個例子:
var values = new List<int>() {10,20,30}; var funcs = new List<Func<int>>(); foreach(var val in values) { funcs.Add(() => val); } foreach(var f in funcs) { Console.WriteLine((f())); }
第一條foreach語句新增了funcs列表中每個元素。新增到列表中的函數使用lambda表示式。該lambda表示式使用了一個變數val,該變數在lambda表示式的外部定義為foreach語句的迴圈變數。第二條foreach語句迭代funcs列表,以呼叫列表中參照的每個函數。
在C#5.0之前版本編譯這段程式碼時,會在控制檯輸出30三次。這是因為,在第一個foreach迴圈中使用閉包,所建立的函數是在呼叫時,而不是在迭代時獲得val變數的值。在https://www.jb51.net/article/244045.htm中介紹foreach時講到編譯器會從foreach語句中建立一個while迴圈。在C#5.0之前版本中,編譯器在while迴圈外部定義迴圈變數,在每次迭代中重用這個變數。因此,在迴圈結束時,該變數的值就是最後一次迭代時的值。要想在使用C#5.0之前版本時,輸出10,20,30,需要將程式碼改為使用一個區域性變數:
var values = new List<int>() {10,20,30}; var funcs = new List<Func<int>>(); foreach(var val in values) { var v = val; funcs.Add(() => v); } foreach(var f in funcs) { Console.WriteLine((f())); }
在C#5.0中,不再需要做這種程式碼修改。C#5.0會在while迴圈的程式碼中建立一個不同的區域性迴圈變數。
到此這篇關於C#中Lambda表示式的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45