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

时间:2009-11-09 11:43:59

标签: c# lambda closures

  

可能重复:
  What are ‘closures’ in .NET?

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

9 个答案:

答案 0 :(得分:20)

我说这是重复的:What are ‘closures’ in .NET?

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

答案 1 :(得分:12)

  

你的鞋子在大厅里;您的   夹克在厨房里。放他们   在和你的手套(他们在   出门时,出门。

     

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

小孩戏。忘记了整个世界。

闹钟响起;小孩看到了:十一点!哦 - 到户外用“外出”关闭来买面包。

答案 2 :(得分:10)

我喜欢Javascript的Google example(您可以轻松地将其变形为C#)。这不是一个5岁的孩子会理解的东西但是我怀疑平均 5岁的孩子会理解功能是什么。

/*
* 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();
}

答案 3 :(得分:8)

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

  

拿这个盒子;建立自己   一个漂亮的小太空船。当你去   到比利的房子,带上你的空间   在那里工艺;有闭合你可以   仍然可以使用你的所有作品   即使盒子被遗弃,也是一大堆   在你的卧室里。

答案 4 :(得分:5)

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

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

答案 5 :(得分:4)

如果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<Customer> 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);
}

答案 6 :(得分:2)

Closure (computer science)说:

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

<强>翻译
    闭包关闭/附加函数周围的变量,以便该函数可以传送到其他地方并仍然使用这些变量     例如假设你被传送到一个偏远的地方,但仍然可以看到躺在你桌子上的棺材杯子

示例:

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

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

所以如果你想要一个返回10的函数,请使用makefunc(10)(),尽管回到10只是无用的方法:)

答案 7 :(得分:0)

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

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

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

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

答案 8 :(得分:0)

这是在C#中使用这个想法的简单方法:Closure