🧠 C# Задача: “Ловушка замыкания в цикле”
📜 Условие:
Посмотри на этот код и скажи, что он выведет:
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main()
{
var actions = new List<Action>();
for (int i = 0; i < 5; i++)
{
actions.Add(() => Console.Write(i + " "));
}
foreach (var action in actions)
{
action();
}
}
}
❓ Вопросы:
1. Что напечатает программа?
2. Почему результат может удивить?
3. Как исправить код, чтобы получить
0 1 2 3 4
?⚠️ Подвох:
- Переменная
i
захватывается по ссылке всеми лямбдами в List<Action>
, а не копируется в момент добавления.- Когда цикл завершится,
i == 5
, и все лямбды обращаются к одному и тому же `i`, уже равному 5
.---
### ✅ Ожидаемый вывод:
5 5 5 5 5
🛠️ Исправление:
Чтобы каждая лямбда захватывала свою копию `i`, нужно добавить промежуточную переменную:
for (int i = 0; i < 5; i++)
{
int copy = i;
actions.Add(() => Console.Write(copy + " "));
}
Теперь вывод будет:
0 1 2 3 4
🎯 Что проверяет задача:
- Знание механики замыканий в C#
- Понимание разницы между значениями и ссылками в замыкании
- Умение отлаживать неожиданные результаты в LINQ и делегатах
>>Click here to continue<<