Добавить в корзинуПозвонить
Найти в Дзене

И немного примеров по замыканию для понимания

Завершим тему замыкания полностью примерами. 1. Лямбда использует только свои параметры и локальные переменные внутри себя Func<int, int> inc = x => x + 1; Console.WriteLine(inc(10)); // 11 Console.WriteLine(inc.Target); // null (обычно), т.к. нечего захватывать Почему нет замыкания: нет ссылок на переменные “снаружи”; всё, что нужно, приходит через параметр x. 2. Лямбда обращается только к static членам Func<int, int> f = x => Math.Abs(x); Console.WriteLine(f(-5)); // 5 Console.WriteLine(f.Target); // null (обычно) Почему нет замыкания: Math.Abs — статический метод, ему не нужен объект/окружение. 3. Используется const (константа), а не переменная const int k = 10; Func<int, int> add = x => x + k; Console.WriteLine(add(5)); // 15 Console.WriteLine(add.Target); // null (обычно) Почему нет замыкания: const — не “переменная”, это значение, которое компилятор подставляет напрямую. Захватывать нечего. 4. Method group на статический метод static int Square(in

И немного примеров по замыканию для понимания

Завершим тему замыкания полностью примерами.

1. Лямбда использует только свои параметры и локальные переменные внутри себя

Func<int, int> inc = x => x + 1;

Console.WriteLine(inc(10)); // 11

Console.WriteLine(inc.Target); // null (обычно), т.к. нечего захватывать

Почему нет замыкания: нет ссылок на переменные “снаружи”; всё, что нужно, приходит через параметр x.

2. Лямбда обращается только к static членам

Func<int, int> f = x => Math.Abs(x);

Console.WriteLine(f(-5)); // 5

Console.WriteLine(f.Target); // null (обычно)

Почему нет замыкания: Math.Abs — статический метод, ему не нужен объект/окружение.

3. Используется const (константа), а не переменная

const int k = 10;

Func<int, int> add = x => x + k;

Console.WriteLine(add(5)); // 15

Console.WriteLine(add.Target); // null (обычно)

Почему нет замыкания: const — не “переменная”, это значение, которое компилятор подставляет напрямую. Захватывать нечего.

4. Method group на статический метод

static int Square(int x) => x * x;

Func<int, int> sq = Square;

Console.WriteLine(sq(4)); // 16

Console.WriteLine(sq.Target); // null

Почему нет замыкания: делегат просто указывает на статический метод, окружение не нужно.

5. static-лямбда (C# 9+) — гарантирует отсутствие захват

Func<int, int> ok = static x => x + 1; // захват запрещён

int y = 10;

// Func<int, int> bad = static x => x + y; // ошибка компиляции: нельзя захватить y

Почему нет замыкания: ключевое слово static у лямбды запрещает захват внешних переменных и this. Если “захватить” всё же пытаешься — код не компилируется.

Наберем 50 🔥️️ могу сделать подборку примеров где замыкание часто появляется и составить пост с задачками и ответом под спойлером, чтобы вы могли себя проверить.

#интересное