Это все еще закрытие? - PullRequest
       45

Это все еще закрытие?

3 голосов
/ 16 февраля 2009

Метод testit () является закрытием. aString вышла из области видимости, но testit () все еще может выполняться на нем. testit2 () использует переменную, которая не выпала из области видимости (mystring), но также не была передана в testit2 (). Testit2 () считается закрытием?

string mystring = "hello world";
Action testit = new Action(delegate { string aString = "in anon method"; Debug.WriteLine(aString); });
testit();

//capture mystring.  Is this still a closure?
Action testit2 = new Action(delegate { Debug.WriteLine(mystring); });
//mystring is still in scope
testit2();

Во втором примере mystring можно обновить за пределами метода, и эти изменения будут отражены в testit2 (). Это не ведет себя как обычный метод, который мог бы захватывать только mystring в качестве параметра.

Ответы [ 3 ]

6 голосов
/ 16 февраля 2009

Оба примера являются анонимными функциями. Второй из которых использует замыкание для захвата локальных переменных. Время жизни переменной для анонимной функции не влияет на то, создано ли замыкание для его использования. Пока переменная определена вне анонимной функции и используется внутри, будет создано замыкание.

Первая анонимная функция не использует локальное состояние, поэтому не нуждается в закрытии. Он должен компилироваться до статического метода.

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

3 голосов
/ 16 февраля 2009

Закрытие охватывает не значения в области, но фактическое определение области. Поэтому любой другой фрагмент кода, имеющий ссылку на ту же область видимости, может изменять переменные внутри него.

1 голос
/ 16 февраля 2009

testit - это не столько закрытие, сколько testit2 на самом деле - он использует только локальную переменную , а не переменную в "родительской" среде (например, mystring ).

Однако я бы сказал, что оба являются замыканиями, поскольку они имеют способность захватывать переменные из окружающей их среды благодаря анонимным методам.

...