关于foreach和delegate的问题

2023-12-01

假设有以下代码:

foreach(Item i on ItemCollection)
{
   Something s = new Something();
   s.EventX += delegate { ProcessItem(i); };
   SomethingCollection.Add(s);
}

当然,这是错误的,因为所有委托都指向同一个 Item。另一种选择是:

foreach(Item i on ItemCollection)
{
   Item tmpItem = i;
   Something s = new Something();
   s.EventX += delegate { ProcessItem(tmpItem); };
   SomethingCollection.Add(s);
}

在这种情况下,所有代表都指向他们自己的项目。

这种方法怎么样?还有其他更好的解决方案吗?


更新:这里有关于这个问题的广泛分析和评论:

http://ericlippert.com/2009/11/12/fitting-over-the-loop-variable-considered-harmful-part-one/


这是一个极其频繁报告的问题;通常它被报告为编译器错误,但实际上编译器正在根据规范做正确的事情。匿名函数关闭变量, not values,并且只有一个 foreach 循环变量。因此,每个 lambda 都会关闭同一个变量,从而获得该变量的当前值。

这几乎让每个人都感到惊讶,并导致很多混乱和许多错误报告。我们是考虑到更改假设的 C# 未来版本的规范和实现,以便在循环构造内逻辑声明循环变量,每次通过循环都会给出一个“新鲜”变量。

这将是一个突破性的改变,但我怀疑依赖这种奇怪行为的人数相当少。如果您对此主题有意见,请随时在上述更新中提到的博客文章中添加评论。谢谢!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于foreach和delegate的问题 的相关文章

随机推荐