gpt4 book ai didi

c# - 关于foreach和委托(delegate)的问题

转载 作者:太空狗 更新时间:2023-10-29 22:10:07 25 4
gpt4 key购买 nike

假设如下代码:

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

当然,这是错误的,因为所有委托(delegate)都指向同一个项目。替代方案是:

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

在这种情况下,所有委托(delegate)都指向他们自己的项目。

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

最佳答案

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

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


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

这几乎让每个人都感到惊讶,并导致很多困惑和错误报告。我们正在考虑更改假设的 future C# 版本的规范和实现,以便循环变量在循环构造内逻辑声明,每次循环都提供一个"new"变量。

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

关于c# - 关于foreach和委托(delegate)的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1600597/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com