【发布时间】:2010-10-01 21:28:01
【问题描述】:
我一直在学习 C#,并且正在尝试理解 lambda。在下面的示例中,它打印了 10 十次。
class Program
{
delegate void Action();
static void Main(string[] args)
{
List<Action> actions = new List<Action>();
for (int i = 0; i < 10; ++i )
actions.Add(()=>Console.WriteLine(i));
foreach (Action a in actions)
a();
}
}
显然,lambda 后面生成的类存储了一个引用或指向int i 变量的指针,并在每次循环迭代时为同一个引用分配一个新值。有没有办法强制 lamda 获取副本,比如 C++0x 语法
[&](){ ... } // Capture by reference
对比
[=](){ ... } // Capture copies
【问题讨论】:
-
您可能想阅读this article,由我们自己的 Jon Skeet 撰写。
-
我觉得奇怪的是,这个问题的大多数答案都在解释捕获语义,这对问题的作者来说是非常清楚的,而只有一些人提到了解决方案(临时副本)。没有人在回答之前阅读问题吗?