20 闭包
20.7 閉包的概念。內層函數引用的外層函數的變量的最終值。
我們預期的輸出是, jiejiep, xiaoyi, zhangzetian
但是實際我們運行后發現,程序會報錯,提示索引超出界限。
為什么沒有達到我們預期的效果呢?讓我們再來看一下閉包的概念。內層函數引用的外層函數的變量的最終值。就是說,當線程中執行方法時,方法中的i參數的值,始終是userList.Count。原來如此,那我們該如何
避免閉包陷阱呢?C#中普遍的做法是,將匿名函數引用的變量用一個臨時變量保存下來,然后在匿名函數中使用臨時變量。
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;}由循環的初始部分聲明的變量只被實例化一次。這很容易弄錯!如果你想捕獲循環變量在一次特定的循環迭代中的值,必須在循環內部引入另一個變量,并將循環變量的值復制給它,再捕捉那個新變量
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;}
?
轉載于:https://www.cnblogs.com/kikyoqiang/p/10152532.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
- 上一篇: 待处理财产损益借方表示什么
- 下一篇: 信用卡临时额度怎么变成固定额度