外变量陷阱到底是什么?感谢C#中的解释和示例。
编辑:合并乔恩·斯基特的diktat :)
外部可变陷阱上的Eric Lippert
当开发人员期望变量值由lambda表达式或匿名委托捕获,而实际上是变量本身被捕获时,就会发生“外部变量陷阱”。
例:
var actions = new List<Action>(); for (var i = 0; i < 10; i++) { actions.Add(() => Console.Write("{0} ", i)); } foreach (var action in actions) { action(); }
可能的输出#1:
0 1 2 3 4 5 6 7 8 9
可能的输出#2:
10 10 10 10 10 10 10 10 10 10
如果您期望输出#1,那么您就陷入了外部变量陷阱。您将获得输出#2。
固定:
声明要重复捕获的“内部变量”,而不是仅捕获一次的“外部变量”。
var actions = new List<Action>(); for (var i = 0; i < 10; i++) { var j = i; actions.Add(() => Console.Write("{0} ", j)); } foreach (var action in actions) { action(); }
有关更多详细信息,另请参见Eric Lippert的博客。