• 捕获变量


    1.认识捕获变量

            static void Main(string[] args)
            {
                Action action = CaptureVariable();
                action();
            }
            static Action CaptureVariable()
            {
                int flag = 0;
                Action action = () =>
                {
                    flag++;
                    Console.WriteLine("flag=" + flag);
                };
                flag = 100;
                action();
                return action;
            }
    

      

    可以看出委托实例action内和action外都可以修改flag的值,是同一个flag变量,flag的作用域跟随委托实例action

    2.捕获变量实现原理——没有捕获变量

            static void Main(string[] args)
            {
            }
            static Action CaptureVariable()
            {
                int flag = 0;
                Action action = () =>
                {
                    Console.WriteLine("");
                };
                return action;
            }
    

     

    ——捕获flag变量

            static void Main(string[] args)
            {
            }
            static Action CaptureVariable()
            {
                int flag = 0;
                Action action = () =>
                {
                    Console.WriteLine(flag);
                };
                return action;
            }
    

      

     如上图,编译时会在当前类内部新建一个类"<>c_DisplayClass0"维护变量flag

    3.捕获两个变量(一个共享一个非共享)

            static void Main(string[] args)
            {
                List<Action> actionList = CaptureVariable();
                foreach (var action in actionList)
                {
                    action();
                }
            }
            static List<Action> CaptureVariable()
            {
                List<Action> list = new List<Action>();
                int flag = 0;
                for (int i = 0; i < 5; i++)
                {
                    int flag2 = 0;
                    Action action = () =>
                    {
                        flag++;
                        flag2++;
                        Console.WriteLine("flag=" + flag + "  flag2=" + flag2);
                    };
                    list.Add(action);
                }
                return list;
            }
    

      

    捕获两个变量,会创建两个类来维护两个变量

    运行结果:

    flag是5个委托实例共享一个变量,flag2是每个委托各自有各自的flag2

  • 相关阅读:
    Android 4.1 for Developers
    Frame Animation 帧动画
    07事事精明,人人远离。
    Launcher 拖拽 流程小结『android 2.3 2.2』
    Android开发书籍推荐
    My first App EncryptWheel is in WAITING FOR REVIEW status
    ubuntu安装显卡驱动
    Shell脚本学习笔记(十)文件操作
    Shell脚本学习笔记(四)流程控制
    Shell脚本学习笔记(五)函数
  • 原文地址:https://www.cnblogs.com/doujiaomifan/p/4233526.html
Copyright © 2020-2023  润新知