在 foreach 循环内的匿名函数(通常为Lambda表达式)中捕获循环 变量时要格外小心。代码清单16-1就展示了这样一个简单的示例,它看上去似乎会输出 x 、 y 、 z 。

             string[] values = new string[] { "x", "y", "z" };
var actions = new List<Action>(); foreach (string value in values)
{
actions.Add(() => Console.WriteLine(value));
} foreach (Action action in actions)
{
action();
}

  在C# 3和C# 4中,以上代码实际上会打印出三个 z 。循环变量( value )可由Lambda表达式捕获,且名义上在循环的每次迭代中,只有一个变量“实例”的值发生了变化。全部三个委托都将引用相同的变量,并且在最终执行时,该变量的值为 z 。这并不是编译器实现上的错误,而是语言被指定所产生的行为。

  在C# 5中,语言的行为与当初预期的一样:循环的每次迭代都可有效地引入一个单独变量。 每个委托都引用不同的变量,变量的值就是这次循环迭代中产生的值。

  有关该特性的内容就讲到这里,它只是修复了会让很多开发者产生疑惑的语言部分而已。 (Stack Overflow上有超多人询问这方面的问题。)

  但此处要提醒一句:如果编写的代码需用不同版本的C#编译器进行编译,则应注意它们产生 的行为是不同的。对于任何版本的C#来说,代码清单16-1都不会产生警告,而在C# 5中,行为却 神不知鬼不觉地发生了改变。要慎之又慎,并且确保有单元测试可以依靠。

16.1 foreach 循环中捕获变量的变化的更多相关文章

  1. js for 循环中的 变量问题。

    今日处理项目中的一个循环,本来就是一个小小的for循环,后来发现该段程序出现了问题,仔细检查代码没有发现其中的错误.无奈只好叫来了老大帮忙.通过在模版中断点调试(该方式只能自己写debugger断点) ...

  2. C#在foreach循环中修改字典等集合出错的处理

    C#在foreach循环中修改字典等集合出错:System.InvalidOperationException: Collection was modified; enumeration operat ...

  3. 【SQL】小心在循环中声明变量——浅析SQL变量作用域

    本文适用:T-SQL(SQL Server) 先看这个语句: --跑3圈 BEGIN --每圈都定义一个表变量,并插入一行 DECLARE @t TABLE(Col INT PRIMARY KEY) ...

  4. C#不允许在foreach循环中改变数组或集合中元素的值(注:成员的值不受影响)

    C#不允许在foreach循环中改变数组或集合中元素的值(注:成员的值不受影响),如以下代码将无法通过编译. foreach (int x in myArray) { x++; //错误代码,因为改变 ...

  5. 「译」forEach循环中你不知道的3件事

    前言 本文925字,阅读大约需要7分钟. 总括: forEach循环中你不知道的3件事. 原文地址:3 things you didn't know about the forEach loop in ...

  6. 【PHP】 foreach循环中变量引用的一道面试题

    $a = array('a','b','c'); foreach($a as &$v){} foreach($a as $v){ } var_dump($a); 现在.不要打开浏览器,猜测一下 ...

  7. 关于“foreach循环”中遇到的几个问题总结

    1.列表页面用"foreach循环"的时候数据没有显示,此时需要检查你对象模型中属性的首字母是否大写,切记不能大写(本人在做一个项目的时候,对象模型是别人建立的,属性首字母大写了, ...

  8. 用闭包解决 js 循环中函数变量暂存问题

    需求:有一个数组,根据数组的值渲染对应的数字div,单击对应的div 在控制台打印对应的数字.如点击1,控制台打印1. 问题: 不管点击哪个值 打出来都是4 代码如下 <!DOCTYPE htm ...

  9. foreach循环中为什么不要进行remove/add操作

    先来看一段代码,摘自阿里巴巴的java开发手册 List<String> a = new ArrayList<String>(); a.add("1"); ...

随机推荐

  1. PHP的mod_rewrite重写模块将.php后缀换成.html

    apache Rewrite mod_rewrite的魔力 简单举例:创建三个文件.分别命名为 test.html,test.php和.htaccess test.html 输入: <h1> ...

  2. 由文字生成path后制作写字的动画

    在看以下这个开源组件的时候,发现一个非常棒的方法,能够将文字生成path,这样就能够作出用笔写字的效果了. https://github.com/MP0w/MPParallaxCollection 关 ...

  3. Eclipse下单个文件中文乱码问题

    有时候用eclipse打开单个文件,会出现中文乱码问题. 这时可以点菜单栏 Edit -> Set Encoding,Other:UTF-8,通常可以解决问题.

  4. HDU 5489 Difference of Clustering 图论

    Difference of Clustering Problem Description Given two clustering algorithms, the old and the new, y ...

  5. RatingBar android:isIndicator="true"

    有时候我们用RatingBar只须要显示不让它选择或改变,解决办法是设置属性 android:isIndicator="true" isIndicator的意思是:是否是指示器,如 ...

  6. 37. ext 中sm什么意思

    转自:https://zhidao.baidu.com/question/112450217.htmlsm是SelectionModel的缩写默认为RowSelectionModel其他模式还有Che ...

  7. Frequent values(线段树+离散化)

    http://poj.org/problem?id=3368 题意:给出一个非降序排列的整数数组,对于询问(i,j),输出区间[i,j]中出现最多的值的次数. 思路:经典的RMQ,不过我用线段树做的. ...

  8. 用vue-cli快速构建项目

    用vue-cli脚手架快速构建项目的过程:1.首先要在node的环境下安装: 1>安装node:https://nodejs.org/en/(带npm,但是npm太慢了,建议安装cnpm,cnp ...

  9. js mvc框架

    介绍 使用过 JavaScript框架(如 AngularJS, Backbone 或者Ember)的人都很熟悉在UI(用户界面,前端)中mvc的工作机理.这些框架实现了MVC,使得在一个单页面中实现 ...

  10. JavaScript--输出内容(document.write)

    document.write() 可用于直接向 HTML 输出流写内容.简单的说就是直接在网页中输出内容. 第一种:输出内容用“”括起,直接输出""号内的内容. <scrip ...