我一直在学习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 的引用或指针,并且每次循环迭代时都会给同一引用赋新值。是否有一种方法可以强制 lambda 抓取副本,就像 C++0x 语法一样?
[&](){ ... } // Capture by reference
对比。
[=](){ ... } // Capture copies
object o = new object(); Task.Run(() => Console.Write($"o is null: {o==null}");); o = null;
会打印TRUE。这意味着您必须自己创建一个副本,并在lambda执行之前不修改它,以获得所需的效果。 - Nenad