C#Closure没有按预期工作
发布时间:2020-12-16 09:47:52 所属栏目:百科 来源:网络整理
导读:我无法理解两块代码之间的区别.考虑有一个程序 class Program{ static void Main(string[] args) { ListNumber numbers = new ListNumber { new Number(1),new Number(2),new Number(3) }; ListAction actions = new ListAction(); foreach (Number numb in
我无法理解两块代码之间的区别.考虑有一个程序
class Program { static void Main(string[] args) { List<Number> numbers = new List<Number> { new Number(1),new Number(2),new Number(3) }; List<Action> actions = new List<Action>(); foreach (Number numb in numbers) { actions.Add(() => WriteNumber(numb)); } Number number = null; IEnumerator<Number> enumerator = numbers.GetEnumerator(); while (enumerator.MoveNext()) { number = enumerator.Current; actions.Add(() => WriteNumber(number)); } foreach (Action action in actions) { action(); } Console.ReadKey(); } public static void WriteNumber(Number num) { Console.WriteLine(num.Value); } public class Number { public int Value; public Number(int i) { this.Value = i; } } } 输出是 1 2 3 3 3 3 这两个代码块应该完全相同.但是你可以看到闭包不适用于第一个循环.我错过了什么? 提前致谢. 解决方法
您在while循环之外声明了数字变量.对于每个数字,您将其引用存储在数字变量中 – 每次覆盖最后一个值.
您应该只在while循环中移动声明,因此每个数字都有一个新变量. IEnumerator<Number> enumerator = numbers.GetEnumerator(); while (enumerator.MoveNext()) { Number number = enumerator.Current; actions.Add(() => WriteNumber(number)); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |