lambda闭包C#4.0和5.0,通过foreach使用的区别

本文探讨了C# 4.0和5.0中使用lambda表达式和闭包在foreach循环中的行为差异。通过示例代码,展示了不同版本下如何捕获和引用循环变量,以及如何影响最终的输出结果。在4.0中,未使用局部变量会导致所有lambda表达式引用相同值,而在5.0中,这种行为得到了修正。



           首先来看一下lambda语法:

            int someval = 5;
            Func<int, int> k = x => x + someval;
            someval = 7;
            Console.WriteLine(k(3));

            //以上代码的输出结果为 10;至于为什么是10可以思考一下,这是理解下面的关键

            var values = new List<int> { 10, 20, 30 };
            var func = new List<Func<int>>();

            //下面这段代码和下面的foreach代码的原理,两段代码等价,
            IEnumerator<int> ev = values.GetEnumerator();
            while (ev.MoveNext()) {
                int v = ev.Current;
                func.Add(() => v);
            }

            //4.0 编译器是在循环外面定义 变量v,代码如下:

            IEnumerator<int> ev = values.GetEnumerator();
            int z;
            while (ev.MoveNext()) {
                z = ev.Current;
                func.Add(() => z);
            }
            //foreach 的本质是一个枚举器和一个while循环
            foreach (var val in values)
            {
                //如果不加var v= val 输出结果就是三个:30,30,30;加就变为10,20,30
                //以上注释是针对4.0的,如果是c#5.0的话不加,就能输出10,20,30

                var v = val;//4.0才需要这句话,这是因为4.0是在循环外面定义循环变量
                func.Add(() => v);
            }
            foreach (var f in func)
            {
                Console.WriteLine(f());
            }

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值