Выбор ответа Middle Делегаты и события спрашивают часто обновлено

Замыкание на переменную цикла for

Вопрос

Что выведет код?

var actions = new List<Action>();
for (int i = 0; i < 3; i++)
    actions.Add(() => Console.Write(i + " "));
foreach (var a in actions) a();

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: 3 3 3. Переменная i у цикла for одна на весь цикл, и все три лямбды захватывают её саму, а не значение.

Варианты ответа

  1. 0 1 2
  2. 2 2 2
  3. 0 0 0
  4. 3 3 3правильный ответ

Разбор

Переменная i у цикла for одна на весь цикл, и все три лямбды захватывают её саму, а не значение. К моменту вызова цикл завершился, i равна 3. В foreach с C# 5 переменная своя на каждую итерацию, и там вывод был бы 0 1 2. Чтобы исправить for, копируют значение: int copy = i; внутри тела.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме