И начнем мы с определения. Что такое замыкание? Замыкание (closure) в C# — это ситуация, когда лямбда-выражение или анонимный метод использует переменные из внешней области видимости, и компилятор обеспечивает, чтобы эти переменные продолжали существовать (и оставались общими для всех таких лямбд), даже если внешний метод уже завершил работу. И сразу же многие думают про боксинг в этом случае. Но классический пример замыкания самый простой будет выглядеть как-то так: static Func<int> MakeCounter() { int x = 0; // захваченная локальная переменная return () => ++x; // замыкание: лямбда использует x из внешней области } static void Main() { var counter = MakeCounter(); Console.WriteLine(counter()); // 1 Console.WriteLine(counter()); // 2 Console.WriteLine(counter()); // 3 } Почему это так работает? Потому что при таком использовании казалось бы странном, создается объект закмыкания, и разворачивается как-то так (грубо говоря): // Скрытый класс замыкания (display class) p