Лямбда может быть реализована с использованием замыкания, но оно не обязательно само по себе замыкание.
A closure - это «функция вместе со ссылочной средой для нелокальных переменных этой функции.».
Когда вы создаете лямбда-выражение, которое использует переменные, определенные вне метода, тогда лямбда-выражение должно быть реализовано с использованием замыкания. Например:
int i = 42;
Action lambda = () => { Console.WriteLine(i); };
В этом случае сгенерированный компилятором метод должен иметь доступ к переменной (i
), определенной в совершенно другой области видимости. Для того, чтобы это работало, генерируемый им метод является «функцией вместе со ссылочной средой» - в основном он создает «замыкание» для получения доступа к переменной.
Однако эта лямбда:
Action lambda2 = () => { Console.WriteLine("Foo"); }
не полагается на какую-либо "среду обращения", поскольку это полностью автономный метод. В этом случае компилятор генерирует обычный статический метод, и замыкание вообще не используется.
В обоих случаях лямбда создает delegate
(«объект функции»), но в первом случае это только замыкание, поскольку лямбда не обязательно должна «захватывать» среду ссылок во всех случаи.