Может кто-нибудь объяснить мне, что такое замыкание на самом простом языке?

Возможный дубликат:
Что такое "замыкания" в.NET?

Я в настоящее время смотрю на лямбда-выражение, и слово закрытие продолжает прибывать. Может кто-нибудь объяснить мне это на самом простом языке.

9 ответов

Решение

Я бы сказал, что это дубликат: что такое "замыкания" в.NET?

"По сути, замыкание - это блок кода, который может быть выполнен позднее, но который поддерживает среду, в которой он был впервые создан, т.е. он все еще может использовать локальные переменные и т. Д. Метода, который его создал, даже после этот метод завершил выполнение."

Ваша обувь в холле; твой пиджак на кухне. Наденьте их и свои перчатки (они в ящике), когда выходите на улицу.

Теперь вы можете поиграть со своими машинами. В одиннадцать часов вы должны пойти купить немного хлеба в магазине на углу.

Малыш играет. Забывает весь мир.

Будильник гаснет; Малыш видит: одиннадцать часов! Ох - выйдите на улицу, чтобы купить хлеб, используя закрывающуюся "выходя на улицу".

Мне нравится пример Google для Javascript (вы можете легко изменить его для 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();
}

Приведенный ниже ответ был на оригинальную формулировку, которая была похожа на "Как объяснить закрытие 5-летнего ребенка".

Возьми эту коробку с легосами; построй себе симпатичный маленький космический корабль. Когда вы идете к дому Билли и несете туда свой космический корабль; с крышками вы все еще можете использовать все части вашей коробки с легосом, даже если коробка осталась в вашей спальне.

Если вам действительно нужно сделать это простым, тогда замыкание - это функция с ее контекстом. Функция в замыкании по-прежнему может обращаться к тем же переменным, что и при определении, независимо от того, откуда вы ее вызываете. (В Lua это называется upvalues, что, я думаю, очень описательный термин.)

Сначала я познакомился с концепцией в Lua, и это определение помогло мне понять концепцию. Может быть, взгляните на Lua: его простота и мощь очаровательны и, безусловно, помогают выработать определенный взгляд на другие языки. Его концепция закрытия была бы хорошим примером для этого.

Если бы 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);
}

Закрытие (информатика) говорит:

В информатике замыкание - это первоклассная функция со свободными переменными, которые связаны в лексической среде.

Перевод:
Закрытие закрывает / присоединяет переменные вокруг функции, так что эту функцию можно телепортировать в другое место и по-прежнему использовать эти переменные, например, предположим, что вы телепортированы в удаленное место, но у вас все еще есть доступ к кружке с крышкой, лежащей на вашем столе

Пример:

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

Теперь, используя makefunc, вы можете создавать множество анонимных функций, которые будут возвращать то, что вы передаете makefunc.

Поэтому, если вам нужна функция, которая возвращает 10, используйте makefunc(10)(), хотя довольно бесполезный способ вернуть 10:)

Когда вы знаете, как что-то сделать в целом, вы можете указать некоторые (или все) детали и получить заключение.

Например, вы знаете, как купить мороженое. Вы знаете, что делать, если вы будете перед любым магазином. Но если вы хотите пойти в какой-то конкретный магазин (например, из-за воскресной скидки), вы переезжаете из дома, чтобы купить там мороженое. "Купи мороженое в магазине на углу" - это закрытие слова "купи мороженое". Фактически, все это замыкания "купите мороженое где-нибудь":

  • Купите мороженое на углу
  • Купить два мороженого
  • Купи два мороженого на углу

Теперь иди играть с друзьями, сынок! (и я не имею в виду ничего подобного перед детьми)

Это простой подход к идее в C#: Закрытие

Другие вопросы по тегам