关于foreach语句在C#4.5中的改进看这样一段代码,你觉得会输出什么呢?C# codeint[] data new int[] { 1,
关于foreach语句在C#4.5中的改进 看这样一段代码,你觉得会输出什么呢?
C# code
int[] data = new int[] { 1, 2, 3, 4, 5 };List<Func<int>> actions = new List<Func<int>>();foreach (int x in data){ actions.Add(() => x);}foreach (var foo in actions){ Console.WriteLine(foo());}
如果你使用的是C# 4.0,运行结果是55555。
不要感到吃惊,因为在 C# 4.0 中,foreach的实现是这样的:
C# code
int[] data = new int[] { 1, 2, 3, 4, 5 };List<Func<int>> actions = new List<Func<int>>();IEnumerator e = data.GetEnumerator();int x = 0;while (e.MoveNext()){ x = (int)e.Current; actions.Add(() => x);}foreach (var foo in actions){ Console.WriteLine(foo());}
int[] data = new int[] { 1, 2, 3, 4, 5 };List<Func<int>> actions = new List<Func<int>>();IEnumerator e = data.GetEnumerator();while (e.MoveNext()){ int x = 0; x = (int)e.Current; actions.Add(() => x);}foreach (var foo in actions){ Console.WriteLine(foo());}
int[] data = new int[] { 1, 2, 3, 4, 5 };List<Func<int>> actions = new List<Func<int>>();foreach (int x in data){ int x1 = x; actions.Add(() => x1);}foreach (var foo in actions){ Console.WriteLine(foo());}
var data = new int[] { 1, 2, 3, 4, 5 };var actions = data.Select(x1 => (Func<int>) (() => x1)).ToList();foreach (var foo in actions){ Console.WriteLine(foo());} [解决办法] 呵呵,不过和 foreach 没有关系了~~~ [解决办法] 这个好像很类似javascript的问题:
var result = []; for(var i=0; i < 10; i++) { result.push(function () { return i }) } console.log(result[5]()); // 10, not 5
解决方法是使用闭包:
var result = []; for(var i=0; i < 10; i++) { (function (i) { // copied i result.push(function () { return i }) }(i)); // original i } console.log(result[5]()); // 5