一尘不染

Lambda表达式在C#闭包中吗?

c#

Lambda表达式(某种程度上是匿名函数)是否闭包?

我对闭包的理解是,它们是被视为对象的函数,这似乎可以准确表示匿名函数和Lambda表达式的作用。

称它们为闭包是否正确?我知道闭包是由于lisp方言而产生的(或变得很流行),但这也是通用的编程术语吗?

感谢您提供的任何澄清!


阅读 260

收藏
2020-05-19

共1个答案

一尘不染

Lambda可以使用闭包来实现,但它本身不一定是闭包。

一个封闭是“与该函数的非局部变量引用环境中共同发挥作用。”

当您使用在方法外部定义的变量制作lambda表达式时,必须使用闭包来实现lambda。例如:

int i = 42;

Action lambda = () => { Console.WriteLine(i); };

在这种情况下,编译器生成的方法必须有权访问i在完全不同的范围内定义的变量()。为了使它起作用,它生成的方法是“将函数与引用环境一起使用”-基本上,它是在创建“闭包”以检索对变量的访问。

但是,此lambda:

Action lambda2 = () => { Console.WriteLine("Foo"); }

因为它是完全包含的方法,所以它不依赖任何“引用环境”。在这种情况下,编译器将生成普通的静态方法,并且根本不涉及任何闭包。

在这两种情况下,lambda都会创建一个delegate(“函数对象”),但在第一种情况下它只是创建一个闭包,因为lambda不一定在所有情况下都必须“捕获”引用环境。

2020-05-19