委托匿名方法中捕获变量

注意点:

    1、创建委托实例不会先执行

    2、对于一个捕获变量,只要还有任何委托实例在引用它,他就会一直存在。

    3、每个委托各自维护各自的捕获变量

    4、判断这个一个变量是否是多个委托共用的,判断在创建委托时候这个变量是否重新创建了

 

1、捕获周期变长了,下面的例子在调用CreateDelegateInstance()方法后,猜测存在函数对应的栈上的局部变量counter就已经销毁了,事实是编译器创建了个额外的类来容纳变量,存放到堆上了。而且委托对该实例也有引用,所以除非委托准备好垃圾回收,否则这个实例是不会被回收的。

static Action TestDeleParameter()
        {
            int counter = 100;

            Action retDel = delegate
            {
                System.Windows.MessageBox.Show(counter.ToString());
                counter +=100;
            };
            retDel();
            return retDel;
        }


//调用
Action dele = TestDeleParameter();
            dele();
            dele();

结果是100、200、300

2、注册了5个委托,每个委托实例都各自引用了counter捕获变量,而且每个委托的counter的捕获变量都是各自委托自己维护的,所以执行第一个委托(lisDele[0]),第一个委托的counter执行相对应的变化,而不会影响剩下四个捕获变量counter的变化。

            List<Action> lisDele = new List<Action>();
            for(int i=0; i<5; i++)
            {
                int counter = i * 10;
                lisDele.Add(delegate
                {
                    System.Windows.MessageBox.Show(counter.ToString());
                    counter++;
                });
            }

            lisDele[0]();    //0
            lisDele[1]();    //10
            lisDele[2]();    //20
            lisDele[3]();    //30
            lisDele[4]();    //40

            //下面循环输出:1、11、21、31、41,因为上面五行代码已经执行了五个委托一次,所以各自的            
            //counter都进行了++,所以会有如此的结果
            foreach (var methodInvoker in lisDele)
            {
                methodInvoker();
            }

            //此时第一个委托的counter值为2,所以有以下如此输出
            lisDele[0]();    //2
            lisDele[0]();    //3
            lisDele[0]();    //4

            lisDele[1]();    12

3、使用i作为捕捉变量,这个i就是这五个委托共用的,因为这个i是在创建这五个委托时候没有进行过重新创建,始终是同一个变量

            List<Action> lisDele = new List<Action>();
            for (int i = 0; i < 5; i++)
            {
                //int counter = i * 10;
                lisDele.Add(delegate
                {
                    System.Windows.MessageBox.Show(i.ToString());
                    i++;
                });
            }

            lisDele[0]();    //5
            lisDele[1]();    //6
            lisDele[2]();    //7
            lisDele[3]();    //8
            lisDele[4]();    //9

 

基于python tensorflow2.3的果蔬识别系统源码+模型-基于卷积神经网络的果蔬识别系统,个人经导师指导并认可通过的高分设计项目,评审分98分,项目中的源码都是经过本地编译过可运行的,都经过严格调试,确保可以运行!主要针对计算机相关专业的正在做大作业、毕业设计的学生和需要项目实战练习的学习者,资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。 基于python tensorflow2.3的果蔬识别系统源码+模型-基于卷积神经网络的果蔬识别系统基于python tensorflow2.3的果蔬识别系统源码+模型-基于卷积神经网络的果蔬识别系统基于python tensorflow2.3的果蔬识别系统源码+模型-基于卷积神经网络的果蔬识别系统基于python tensorflow2.3的果蔬识别系统源码+模型-基于卷积神经网络的果蔬识别系统基于python tensorflow2.3的果蔬识别系统源码+模型-基于卷积神经网络的果蔬识别系统基于python tensorflow2.3的果蔬识别系统源码+模型-基于卷积神经网络的果蔬识别系统基于python tensorflow2.3的果蔬识别系统源码+模型-基于卷积神经网络的果蔬识别系统基于python tensorflow2.3的果蔬识别系统源码+模型-基于卷积神经网络的果蔬识别系统基于python tensorflow2.3的果蔬识别系统源码+模型-基于卷积神经网络的果蔬识别系统基于python tensorflow2.3的果蔬识别系统源码+模型-基于卷积神经网络的果蔬识别系统基于python tensorflow2.3的果蔬识别系统源码+模型-基于卷积神经网络的果蔬识别系统基于python tensorflow2.3的果蔬识别系统源码+模型-基于卷积神经
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值