TG Telegram Group & Channel
C# 1001 notes | United States America (US)
Create: Update:

🧠 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 и делегатах

🧠 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<<

C# 1001 notes




Share with your best friend
VIEW MORE

United States America Popular Telegram Group (US)