怎么在C#循环中捕获局部变量
导读:本文共1392.5字符,通常情况下阅读需要5分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 问题:我遇到了一个有趣的问题,它的代码大概是这样的。List<Func<int>>actions=newList<Func<int>>();intvariable=0;while(variable<5){actions.Add(()=>variable*2);++variable;}f... ...
目录
(为您整理了一些要点),点击可以直达。我遇到了一个有趣的问题,它的代码大概是这样的。
我的期望输出是 0,2,4,6,8,但它最终输出的是五个 10,看起来像是这些 action 上下文捕获的都是同一个变量。
请问是否有变通的方法实现我要的预期结果呢?
变通方法就是在你的 loop 循环体中使用一个中间变量,并将其送入到 lambda 体中,参考如下代码:
其实这种情况在多线程下也同样会发生,比如下面的代码:
你以为会打印出 1,2,3,4,5,最后的结果非常有趣,在我这里的输出结果是:2,1,3,3,4 ,你那边的结果肯定又不一样了。
唯一的解决方案就是使用 局部变量,修改后的代码如下:
可能有很多朋友不知道为什么加了一个 variable1 变量之后,代码就正确的,要想分析,可以看 C# 生成的 IL 代码。
可以清楚的看到,那个所谓的 variable1 成了匿名类 c__DisplayClass0_0 下的字段了,而且foreach循环中每次都是new的,所以这个字段必然不一样,这也就保证了正确的结果。
怎么在C#循环中捕获局部变量的详细内容,希望对您有所帮助,信息来源于网络。