问题描述
Lambda可以使用闭包来实现,但它本身不一定是闭包。
当您使用在方法外部定义的变量制作lambda表达式时,必须使用闭包来实现lambda。例如:
int i = 42;
Action lambda = () => { Console.WriteLine(i); };
在这种情况下,编译器生成的方法必须有权访问i
在完全不同的范围内定义的变量()。为了使它起作用,它生成的方法是“将函数与引用环境一起使用”-基本上,它是在创建“闭包”以检索对变量的访问。
但是,此lambda:
Action lambda2 = () => { Console.WriteLine("Foo"); }
因为它是完全包含的方法,所以它不依赖任何“引用环境”。在这种情况下,编译器将生成普通的静态方法,并且根本不涉及任何闭包。
在这两种情况下,lambda都会创建一个delegate
(“函数对象”),但在第一种情况下它只是创建一个闭包,因为lambda不一定在所有情况下都必须“捕获”引用环境。
解决方法
Lambda表达式(某种程度上是匿名函数)是否闭包?
我对闭包的理解是,它们是被视为对象的函数,这似乎可以准确表示匿名函数和Lambda表达式的作用。
称它们为闭包是否正确?我知道闭包是由于lisp方言而产生的(或变得很流行),但这也是通用的编程术语吗?
感谢您提供的任何澄清!