C#的Lambda表达式捕获变量疑问
var j = i;Action b = () =\u0026gt;{ Console.WriteLine(j);};
■网友
测试代码也写得认真一点再让人看好吗。
■网友
C# 里 lambda 需要捕捉外部变量时会新建一个辅助类,辅助类里的成员就是那些外部变量。lambda 内部有这个辅助类的实例,这个带循环的函数里也有同一个实例作为局部变量,需要辅助类里变量时双方都从这个实例里拿。在你这个例子里,辅助类里有变量 i ,循环过程会修改辅助类中 i 的值直到 i == 1。同时,另一个线程里会执行 lambda 。lambda 从辅助类里取 i ,所以就得到线程调度时 i 的值。解决办法就是在循环节里新建局部变量 int j = i; 如此辅助类里的变量变成了 j 并且不会被循环节修改值。(ps:go 和 swift 都有相同问题。。。swift 要用 var 声明 i 才出问题)
■网友
自答:我有错,不仔细看文档问题中的i不是局部变量。“外部变量的引用n被认为是捕获在创建委托时。与本地变量不同,捕获的变量的生存期内扩展,直到引用该匿名方法委托被垃圾回收。”匿名方法(C# 编程指南)
推荐阅读
- 怎样在C语言中处理显式(有理)多项式表达式
- 《C++ primer》(英文第五版)中讲到lambda的返回类型?
- 民警|扬中一河边惊现白狐 民警及时捕获
- 名爵|「e汽车」从内到外的惊艳,名爵5用实力捕获年轻人的心
- NLTK下英文分词,怎样建立自定义字典
- 赵丽颖|野生赵丽颖被捕获 ,真实身材全曝光!网友:这还是女神吗
- C语言中if条件句里面表示判断的表达式应该分哪些类型啊
- 关于正则表达式的一个问题 ([0-9.\\-A-Za-z]+)为啥 . 前面不需要加转义符号
- PS的主要核心是图层和选区,AE、Pr的主要核心是啥
- “C把任何后面加有一个分号的表达式看作是一个语句”这句话是否是错的
