Возможный дубликат:
Что такое закрытие в .NET?
В настоящее время я смотрю на выражение лямбда, и закрытие слова продолжается. Может кто-нибудь объяснить это мне на простом языке.
Возможный дубликат:
Что такое закрытие в .NET?
В настоящее время я смотрю на выражение лямбда, и закрытие слова продолжается. Может кто-нибудь объяснить это мне на простом языке.
Я бы сказал, что это дубликат: Что такое закрытие в .NET?
"По сути, закрытие представляет собой блок кода, который может быть выполнен в более позднее время, но который поддерживает среду, в которой он был сначала создан, то есть он все равно может использовать локальные переменные и т.д. метода, который его создал, даже после того, как этот метод завершил выполнение."
Ребенок играет. Забывает весь мир.Ваша обувь в зале; ваш куртка находится на кухне. Положи их на, и ваши перчатки (они находятся в ящик), выходя на улицу.
Теперь вы можете играть с вашими автомобилями. В одиннадцать часов вы должны пойти купить хлеб в угловом магазине.
Будильник выключается; ребенок видит: одиннадцать часов! Ох - выходите на улицу, чтобы купить хлеб, используя закрытие "выходя за пределы".
Мне нравится пример Google для Javascript (вы можете легко его преобразовать для С#). Это не то, что понимал бы пятилетний человек, но потом я сомневаюсь, что средний 5-летний человек поймет, что это за функция.
/*
* When a function is defined in another function and it
* has access to the outer function 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();
}
Ниже был ответ на оригинальную формулировку, которая была сродни "Как объяснить закрытие пятилетнему ребенку".
Возьмите этот ящик legos; строить себя хороший маленький космический корабль. Когда ты пойдешь билли дома и принести свое пространство там ремесло; с закрытием вы можете все еще можете использовать все части вашего ящик legos, хотя коробка была оставлена в вашей спальне.
Если вам действительно нужно сохранить его простым, то замыкание является функцией с ее контекстом. Функция в закрытии может по-прежнему обращаться к тем же переменным, которые она могла бы определить, когда она была определена, независимо от того, откуда вы ее вызываете. (В Lua они называются upvalues, которые, я думаю, являются очень описательным термином.)
Я впервые встретил концепцию в Lua, и это определение помогло мне понять концепцию. Возможно, взгляните на Lua: его простота и сила увлекательны и, безусловно, помогают развить определенное представление на других языках. Его концепция закрытия будет хорошим примером для этого.
Если 5-летний человек знал С#, я бы объяснил с помощью этого примера кода:
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:)
Когда вы знаете, как вообще что-то делать, вы можете указать некоторые (или все) детали и получить закрытие.
Например, вы знаете, как покупать мороженое. Ты знаешь, что делать, если ты будешь перед магазином. Но если вы хотите пойти в какой-то магазин (например, из-за скидки в воскресенье), вы выходите из дома с целью купить там мороженое. "Купите мороженое в магазине на углу" - это закрытие "купить мороженое". Фактически, все это закрытие "купите мороженое где-то":
Теперь поиграй со своими друзьями, сынок! (и я не помню ничего подобного перед детьми)
Это простой подход к идее в С#: Closure