c# - 在 for 循环中用匿名方法闭包

标签 c# closures

我正在尝试理解闭包,已经阅读了一些 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/

相关文章:

javascript - 在谷歌分析跟踪代码中,为什么他们使用闭包

python - 如何创建 lambda 列表(在列表理解/for 循环中)?

swift - 为什么添加闭包捕获列表会阻止我的实例被释放?

c# - 如何仅获取整数并删除 C# 中的所有字符串

javascript - 关于 JavaScript 软件分解结构指南

c# - LINQ 中的展平列表

c# - 如何在不在列表中的字符串中找到第一个字符的索引

python - Python 2.x 中的 nonlocal 关键字

c# - NativeWindow WndProc 未接收消息

c# 在另一个位图上绘制位图