在事件中输出,为什么得到不一样的结果?

时间:2021-08-19 23:05:37
输出结果如下所示,为什么会不一样??原理是什么?

        static void Main(string[] args)
        {
            var list = new List<A>();
            for (int i = 0; i < 5; i++)
            {
                var str = i.ToString();
                var a = new A();
                a.Handler += (s, e) =>
                {
                    Console.WriteLine("数字:{0}\t字符串:{1}", i, str);
                    // 数字:5 字符串:0
                    // 数字:5 字符串:1
                    // 数字:5 字符串:2
                    // 数字:5 字符串:3
                    // 数字:5 字符串:4
                };
                list.Add(a);
            }

            foreach (var a in list) { a.Do(); }

            Console.ReadKey();
        }

        class A
        {
            public event EventHandler Handler;

            public void Do()
            {
                if (Handler != null)
                    Handler(this, new EventArgs());
            }
        }

2 个解决方案

#1


第一轮循环的时候 你以为i是0?好吧 他确实是0
第二轮的时候 他已经变成1了 知道 i++ 等于 5 的时候不满足条件 跳出了循环
i的最终值是 5 所以说你的数字一直是5 而str每一轮都是一个新的变量
你吧 你的list.Add(a) 直接换成 a.Do() 说不定就会有不同效果了 。。。
以上言论纯属个人YY。。。。。。

#2


你得了解一下闭包的概念

#1


第一轮循环的时候 你以为i是0?好吧 他确实是0
第二轮的时候 他已经变成1了 知道 i++ 等于 5 的时候不满足条件 跳出了循环
i的最终值是 5 所以说你的数字一直是5 而str每一轮都是一个新的变量
你吧 你的list.Add(a) 直接换成 a.Do() 说不定就会有不同效果了 。。。
以上言论纯属个人YY。。。。。。

#2


你得了解一下闭包的概念