小编典典

外部变量陷阱

c#

外变量陷阱到底是什么?感谢C#中的解释和示例。

编辑:合并乔恩·斯基特的diktat :)

外部可变陷阱上的Eric
Lippert


阅读 252

收藏
2020-05-19

共1个答案

小编典典

当开发人员期望变量值由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的博客

2020-05-19