20 闭包
20.7 閉包的概念。內(nèi)層函數(shù)引用的外層函數(shù)的變量的最終值。
我們預(yù)期的輸出是, jiejiep, xiaoyi, zhangzetian
但是實(shí)際我們運(yùn)行后發(fā)現(xiàn),程序會(huì)報(bào)錯(cuò),提示索引超出界限。
為什么沒有達(dá)到我們預(yù)期的效果呢?讓我們?cè)賮砜匆幌麻]包的概念。內(nèi)層函數(shù)引用的外層函數(shù)的變量的最終值。就是說,當(dāng)線程中執(zhí)行方法時(shí),方法中的i參數(shù)的值,始終是userList.Count。原來如此,那我們?cè)撊绾?br />避免閉包陷阱呢?C#中普遍的做法是,將匿名函數(shù)引用的變量用一個(gè)臨時(shí)變量保存下來,然后在匿名函數(shù)中使用臨時(shí)變量。
5.5 匿名方法中的捕獲變量
static MethodInvoker CreateInvoker(){int count = 5;MethodInvoker ret = delegate{Console.WriteLine(count);count++;};ret();return ret;}5.5.4 捕獲變量的延長生存期
static void Main(string[] args){MethodInvoker m = CreateInvoker();m();m();Console.ReadKey();}static MethodInvoker CreateInvoker(){int count = 5;MethodInvoker ret = delegate{Console.WriteLine(count);count++;};ret();return ret;}由循環(huán)的初始部分聲明的變量只被實(shí)例化一次。這很容易弄錯(cuò)!如果你想捕獲循環(huán)變量在一次特定的循環(huán)迭代中的值,必須在循環(huán)內(nèi)部引入另一個(gè)變量,并將循環(huán)變量的值復(fù)制給它,再捕捉那個(gè)新變量
static void Main(string[] args){MethodInvoker m = CreateInvoker();m();m();Console.ReadKey();}static MethodInvoker CreateInvoker(){int count = 5;MethodInvoker ret = delegate{Console.WriteLine(count);count++;};ret();return ret;}
?
轉(zhuǎn)載于:https://www.cnblogs.com/kikyoqiang/p/10152532.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
- 上一篇: 待处理财产损益借方表示什么
- 下一篇: 单元测试框架之unittest(一)