如何防止“索引”在Action数组中自行更新

问题描述 投票:1回答:2

当我用arrayActions添加到for loopdelegate时,我在阵列中更新了。如何防止这种情况发生?

我已经尝试在添加它之前将“I”分配给整数。

Action[] actions = new Action[100];

for (int i = 0;i< actions.Length; i++)
{
    actions[i] = () => Console.WriteLine("Hello"+ i);
}

Action[]的每个行动中的“我”是100;

这是为什么?

c# delegates action
2个回答
0
投票

因为它们都被分配到相同的局部变量“int i”,并且在循环结束后“i”为100

Action[] actions = new Action[100];

for (int i = 0;i< actions.Length; i++)
{
    int a = i;
    actions[i] = () => Console.WriteLine("Hello"+ a);
}

在声明int a = i之后,每个动作都有一个a


0
投票

HereHere对类似问题的解释很好。 Here也是Jon Skeet关于C#闭包的好解释。

for循环中,只使用了一个变量i。这就是为什么稍后当你执行动作时,它们都引用相同的值i=100。如果动作需要使用当前i的实际值,则必须捕获它的副本并将副本存储到操作中。

for (int i = 0;i< actions.Length; i++)
{   
    int copy = i;
    actions[i] = () => Console.WriteLine("Hello"+ copy);
}
© www.soinside.com 2019 - 2024. All rights reserved.