C#中的Lambda表达式是否关闭?
lambda表达式(以及一定程度的匿名函数)是否被关闭?
我对闭包的理解是,它们是被视为对象的函数,它似乎是匿名函数和Lambda表达式的精确表示。
把它们叫做闭包是正确的吗? 我知道由于lisp方言的缘故,关闭(或者变得流行),但这也是一个普通的编程术语吗?
感谢您提供的任何澄清!
lambda可以使用闭包实现,但它本身不一定是闭包。
闭包是“一个函数,以及该函数的非局部变量的引用环境。”
当您创建一个使用在方法外定义的变量的lambda表达式时,lambda必须使用闭包来实现。 例如:
int i = 42;
Action lambda = () => { Console.WriteLine(i); };
在这种情况下,编译器生成的方法必须能够访问在完全不同的作用域中定义的变量( i
)。 为了使其发挥作用,它生成的方法是“一起使用引用环境的函数” - 基本上,它创建一个“闭包”来检索对变量的访问。
但是,这个lambda:
Action lambda2 = () => { Console.WriteLine("Foo"); }
不依赖任何“引用环境”,因为它是一个完全包含的方法。 在这种情况下,编译器会生成一个正常的静态方法,并且根本不涉及任何闭包。
在这两种情况下,lambda都创建了一个delegate
(“函数对象”),但它只是在第一种情况下创建闭包,因为在所有情况下,lambda不一定需要“捕获”引用环境。
里德的回答是正确的。 我只想添加一些额外的细节:
lambda表达式和匿名方法都有闭包语义; 也就是说,它们“捕捉”了它们的外部变量并延长了这些变量的寿命。
匿名函数是我们在使用lambda表达式或匿名方法时使用的术语。 是的,这是令人困惑的。 抱歉。 这是我们能想到的最好的。
一个可以被当作对象的函数只是一个委托。 使lambda成为闭包的是它捕获它的外部变量。
转换为表达式树的lambda表达式也具有闭包语义,足够有趣。 正确地实施这是一个痛苦的脖子,我告诉你!
即使“this”不是一个变量,“this”被认为是创建闭包的“外部变量”。
这是“封闭”而不是“clojure”。
这不是封闭。 闭包基本上是一个函数的表示,以及该函数消耗的任何非局部变量。
从这个意义上说,lambdas并不是闭包,但是如果它们关闭了任何变量,它们确实会导致编译器生成闭包。
如果在包含关闭一些变量的lambda的程序集上使用ILDASM,则会在该程序集中看到一个编译器生成的类,它表示函数以及已关闭的那些变量。 这是关闭。
当你说
被视为对象的函数,
这通常只是“函数对象”(在C#中我们会说“委托”),并且在函数式编程中很常见。
链接地址: http://www.djcxy.com/p/51279.html上一篇: Are Lambda expressions in C# closures?
下一篇: What is lambda?