zoukankan      html  css  js  c++  java
  • 捕获变量

    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

  • 相关阅读:
    性能优化与使用Block实现数据回传(3)
    封装思想和抽取(2)
    磁盘缓存的计算与清理(1)
    滑动返回的延伸(全局滑动返回功能)
    滑动返回功能被覆盖的解决思路
    OC之类与对象
    OC之OC与C的比较
    OC之知识储备篇
    C语言之总结3
    C语言总结2
  • 原文地址:https://www.cnblogs.com/doujiaomifan/p/4233526.html
Copyright © 2011-2022 走看看