问题:
我遇到了一个有趣的问题,它的代码大概是这样的。
List actions = new List();
int variable = 0;
while (variable variable * 2);
++ variable;
}
foreach (var act in actions)
{
Console.WriteLine(act.Invoke());
}
我的期望输出是 0,2,4,6,8
,但它最终输出的是五个 10,看起来像是这些 action 上下文捕获的都是同一个变量。
请问是否有变通的方法实现我要的预期结果呢?
解答方案:变通方法就是在你的 loop 循环体中使用一个中间变量,并将其送入到 lambda 体中,参考如下代码:
List actions = new List();
int variable = 0;
while (variable variable1 * 2);
++variable;
}
foreach (var act in actions)
{
Console.WriteLine(act.Invoke());
}
Console.ReadLine();
其实这种情况在多线程下也同样会发生,比如下面的代码:
for (int counter = 1; counter Console.Write (counter)).Start();
}
你以为会打印出 1,2,3,4,5
,最后的结果非常有趣,在我这里的输出结果是:2,1,3,3,4
,你那边的结果肯定又不一样了。
唯一的解决方案就是使用 局部变量
,修改后的代码如下:
for (int counter = 1; counter Console.Write (localVar)).Start();
}
总结
可能有很多朋友不知道为什么加了一个 variable1
变量之后,代码就正确的,要想分析,可以看 C# 生成的 IL 代码。
private static void Main(string[] args)
{
List actions = new List();
for (int variable = 0; variable
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?