闭包陷阱

闭包对象:如果匿名方法引用了某个局部变量,编译器就会自动将该引用提升到该闭包对象当中。

 

复制代码
class Program
    {
        static void Main(string[] args)
        {
            List<Action> listAction = new List<Action>();
            for (int i = 0; i < 5; i++)
            {
                Action t = () =>
                {
                    Console.WriteLine(i);
                };
                listAction.Add(t);
            }
            Console.WriteLine();

            foreach (var a in listAction)
            {
                a();
            }
            Console.WriteLine();

            Console.WriteLine("----test02----");
            TempClass tempClass = new TempClass();   // 闭包对象
            List<Action> list01 = new List<Action>();
            for (tempClass.i = 0; tempClass.i < 5; tempClass.i++)
            {
                Action a01 = () => { tempClass.TempFuc(); };
                list01.Add(a01);
            }
            foreach (Action a in list01)
            {
                a();
            }
            Console.WriteLine();

            Console.WriteLine("---去闭包对象---");
            List<Action> list02 = new List<Action>();
            for (int i = 0; i < 5; i++)
            {
                TempClass tempClass01 = new TempClass();
                Console.WriteLine(tempClass01.GetHashCode());
                tempClass01.i = i;
                Action a01 = () => { tempClass01.TempFuc(); };
                list02.Add(a01);
            }

            foreach (Action a in list02)
            {
                a();
            }
        }


    }

    class TempClass
    {
        public int i;
        public void TempFuc()
        {
            Console.WriteLine(i.ToString());
        }
    }
复制代码

 

posted @   Wen_Chen  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示