【发布时间】:2016-05-28 02:49:32
【问题描述】:
我有一个关于 C# 中 Action 类型和 Lambda 的快速问题。代码来了:
static void Main(string[] args)
{
List<Action> actions = new List<Action>();
for (int I = 0; I < 10; I++)
actions.Add(new Action(() => Print(I.ToString())));
foreach (Action a in actions)
{
a.Invoke();
}
actions.Clear();
int X;
for (X = 0; X < 10; X++)
{
int V = X;
actions.Add(new Action(() => Print(V.ToString())));
}
foreach (Action a in actions)
{
a.Invoke();
}
Console.ReadLine();
}
public static void Print(string s)
{
Console.WriteLine(s);
}
如果您运行此代码,您将看到它连续输出 10 次、十次,然后第二次输出数字 0-9。它显然与我使用 X 与 I 的方式有关,以及我如何在第二个循环中每次给我的动作一个新变量 V ......可能每个新 V 都是内存中的一个新地址,但我难以理解为什么 I.ToString() 在第一个循环中没有做同样的事情......为什么第一个 Action 中使用的 I.ToString() 的工作方式与第二个示例不同?
【问题讨论】: