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

问题描述 投票:11回答:9

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

我目前正在研究lambda表达式,并且封闭一词不断涌现。有人可以用真正简单的语言向我解释。

c# lambda closures
9个回答
20
投票

我要说这是一个副本:What are ‘closures’ in .NET?

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


12
投票

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

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

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

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


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

8
投票

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

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


5
投票

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

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


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);
}

2
投票

Closure (computer science)说:

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

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

例:

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

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

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


0
投票

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

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

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

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


0
投票

这是C#中的一个简单方法:Closure

© www.soinside.com 2019 - 2024. All rights reserved.