首页新闻找找看学习计划

循环添加Action的问题

0
悬赏园豆:20 [已解决问题] 解决于 2013-10-23 13:26

代码:

List<Action> actions = new List<Action>();
List<string> names = new List<string>();
foreach (var name in names)
{
  actions.Add(() =>
  {
    doSomething(name);
  });
}

这样循环添加之后,发现actions里面添加的都是同一个方法,处理的都是同一个name,比如李雷,所有的行为都变为doSomething(“李雷”)

 

求问各位大师这是咋回事捏?循环只能创建同一个委托??

 

 

 

Williame的主页 Williame | 初学一级 | 园豆:32
提问于:2013-10-23 10:10
< >
分享
最佳答案
1

name 指向到一个对象。这样是一种非常糟糕的编写习惯。

这个对象在迭代被重新赋值。这样改下就变了。

foreach (var name in names)
{
var c = name;
  actions.Add(() =>
  { 
    doSomething(c);
  });
}
收获园豆:15
````` | 专家六级 |园豆:14268 | 2013-10-23 10:29

多谢大侠指点

Williame | 园豆:32 (初学一级) | 2013-10-23 13:25
其他回答(2)
0

楼上正解,这个和延迟执行一个样子。

收获园豆:5
幻天芒 | 园豆:36522 (高人七级) | 2013-10-23 10:58

多谢

支持(0) 反对(0) Williame | 园豆:32 (初学一级) | 2013-10-23 13:26
0

问题根源在于滞后执行。

问题原因是:

编译器对于 匿名方法引用的变量 创建引用(比如_name)防止它们的生命周期早结束。

_name指向name的位置。

 

在滞后执行时,通过_name找到name位置,并找到当前指向的变量值。

waiter | 园豆:998 (小虾三级) | 2013-10-23 13:17

谢谢

支持(0) 反对(0) Williame | 园豆:32 (初学一级) | 2013-10-23 13:28
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册