我正在尝试理解闭包,已经阅读了一些 Material 但是..然后我尝试了这个。
据我所知,生成了一个包含特定匿名方法(在我的例子中是写入控制台的方法)和 int 变量 j 的类。它如何将所有 j 值存储在一个类中?是否有很多此类在幕后生成的实例?
class Program
{
public static List<Action> actions = new List<Action>();
static void Main(string[] args)
{
AddActions(10);
actions[0]();
actions[1]();
Console.ReadLine();
}
public static void AddActions(int count)
{
for (int i = 0; i < count; i++)
{
int j = i;
actions.Add(delegate()
{
Console.Write("{0} ", j);
});
}
}
}
结果:0 1
最佳答案
这是反编译为类而不是 lambda 的代码。
private class Program
{
public static List<Action> actions;
static Program()
{
Program.actions = new List<Action>();
}
private static void Main(string[] args)
{
Program.AddActions(10);
Program.actions[0]();
Program.actions[1]();
Console.ReadLine();
}
public static void AddActions(int count)
{
for (int index = 0; index < count; ++index)
{
Program.\u003C\u003Ec__DisplayClass2_0 cDisplayClass20 = new Program.\u003C\u003Ec__DisplayClass2_0();
cDisplayClass20.j = index;
Program.actions.Add(new Action((object)cDisplayClass20, __methodptr(\u003CAddActions\u003Eb__0)));
}
}
private sealed class \u003C\u003Ec__DisplayClass2_0
{
public int j;
public \u003C\u003Ec__DisplayClass2_0()
{
base.\u002Ector();
}
internal void \u003CAddActions\u003Eb__0()
{
Console.Write("{0} ", (object)this.j);
}
}
}
如您所见,例如循环迭代,您将获得 new Program.\u003C\u003Ec__DisplayClass2_0();
的新实例。
关于c# - 在 for 循环中用匿名方法闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32741336/