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?