有人可以用真正的简单语言向我解释什么是封闭?

可能重复:
什么是.NET中的’闭包’?

我目前正在研究lambda表达式,并且关闭这个词仍在继续。 有人可以用真正简单的语言向我解释。

我要说这是一个重复: .NET中的’闭包’是什么?

“从本质上讲,闭包是一个代码块,可以在以后执行,但它维护了它最初创建的环境 – 即它仍然可以使用创建它的方法的局部变量等,即使在那个方法已经完成了。“

你的鞋子在大厅里; 你的夹克在厨房里。 外出时穿上它们和你的手套(它们在抽屉里)。

现在你可以去玩你的车了。 十一点钟,你必须去角落商店购买一些面包。

孩子们玩。 忘记了整个世界。

闹钟响了; 小孩看到了:十一点! 哦 – 去外面用“外出”封口买面包。

我喜欢Javascript的Google示例 (您可以轻松地将其转换为C#)。 这不是一个5岁的孩子会理解的东西,但后来我怀疑平均 5岁的孩子会理解一个function是什么。

/* * When a function is defined in another function and it * has access to the outer function's context even after * the outer function returns * An important concept to learn in Javascript */ function outerFunction(someNum) { var someString = 'Hai!'; var content = document.getElementById('content'); function innerFunction() { content.innerHTML = someNum + ': ' + someString; content = null; // IE memory leak for DOM reference } innerFunction(); } 

下面的回答是原来的措辞,类似于“如何解释对一个5岁的人的封闭”。

拿这个盒子; 为自己建造一个漂亮的小型太空船。 当你去比利的房子并把你的太空船带到那里; 有了封口,你仍然可以使用你的盒子里的所有碎片,即使盒子留在你的卧室里。

如果你真的需要保持简单,那么闭包是一个带有上下文的函数 。 无论你在何处调用它,闭包中的函数仍然可以访问它定义时的相同变量。 (在Lua中,这些被称为upvalues ,我认为这是一个非常具有描述性的术语。)

我在Lua中首先遇到了这个概念,这个定义帮助我理解了这个概念。 也许看看Lua:它的简单性和强大function令人着迷,当然也有助于在其他语言中发展某种观点。 它的封闭概念就是一个很好的例子。

如果5岁的人知道C#,我会用这个代码示例解释:

 int i = 0; string result = null; Action iExaminer = () => { result = i % 2 == 1 ? "Odd" : "Even"; }; i = 1; iExaminer(); Console.WriteLine(result); 

如果这个5岁的孩子正在学习linq,我会用这个代码示例解释:

 string name = null; IEnumerable query = Customers.Where(c => c.Name == name); name = "Bob"; // query is resolved when enumerated (which is now) // Where will now call our anonymous method. foreach(var customer in query) { Console.WriteLine(customer.Name); } 

关闭(计算机科学)说:

在计算机科学中,闭包是一个具有自由变量的第一类函数,它们在词法环境中受到约束。

翻译:
闭包关闭/附加函数周围的变量,以便该函数可以传送到其他地方并仍然使用这些变量,例如假设您被传送到远程位置但仍然可以访问您躺在桌子上的coffed杯子

例:

 function makefunc(x) { return function(){return x} } 

现在使用makefunc,您可以创建许多匿名函数,这些函数将返回传递给makefunc的函数

因此,如果你想要一个返回10的函数,请使用makefunc(10)(),尽管无用的方法可以回到10 🙂

当您知道如何做一般事情时,您可以指定一些(或所有)细节并获得闭包

例如,您知道如何购买冰淇淋。 如果你在任何商店前面,你知道该怎么办。 但是如果你想去一个特定的商店(例如,由于周日折扣),你搬出了房子,目的是在那里买冰淇淋。 “在拐角处的商店购买一些冰淇淋”是关闭“买一些冰淇淋”。 事实上,所有这些都是“在某个地方买一些冰淇淋”的关闭:

  • 在拐角处买些冰淇淋
  • 买两个冰淇淋
  • 在拐角处买两块冰淇淋

现在和你的朋友一起玩,儿子! (我要记住在孩子面前不要说那样的话)

这是C#中关于这个想法的简单方法: Closure