Как не дать «индексу» обновиться в массиве Action - PullRequest
1 голос
/ 12 апреля 2019

Когда я добавляю к array из Actions с for loop a delegate, I обновляется по всему массиву. Как предотвратить это?

Я пытался присвоить «I» целому числу, прежде чем добавить, что работает.

Action[] actions = new Action[100];

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

«Я» в каждом действии в Action[] равно 100;

Почему это?

Ответы [ 2 ]

0 голосов
/ 12 апреля 2019

, поскольку все они назначены одной и той же локальной переменной "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 голосов
/ 12 апреля 2019

Здесь и Здесь - хорошие объяснения по аналогичному вопросу. Здесь также является хорошим объяснением закрытия C # Джоном Скитом.

В цикле for используется только одна переменная i. Вот почему позже, когда вы выполняете действия, все они ссылаются на одно и то же значение i=100. Если в действии необходимо использовать фактическое значение текущего i, вам необходимо захватить его копию и сохранить копию в действии.

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