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# 编程指南)


    推荐阅读