Завершим тему замыкания полностью примерами.
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 🔥️️ могу сделать подборку примеров где замыкание часто появляется и составить пост с задачками и ответом под спойлером, чтобы вы могли себя проверить.
#интересное