All of the love we left behind watching the flashbacks intertwine. I think our lives have just begun.
Народ, объясните, пожалуйста, замыкания в C#. Каким-нибудь простым человеческим языком. Лямбда-выражения я понимаю, но когда выражение имеет такой вот вид: х += () => Console.Write(i); то я просто теряюсь. Что выполняют эти таинственные скобки? Будет здорово, если объясните на простеньком примере.
Лямбда-выражение (именно как expression - это важно!) в C# имеет следующий вид:
'(' args ')' '=>' body ';'
где args - это список аргументов, а body - это тело выражение.
Список аргументов может быть:
- пустым;
- перечнем имён аргументов (в этом случае окружающие список аргументов скобки могут быть опущены);
- перечнем имён аргументов с указанием типов.
Типы аргументов должны указываться в случае, когда они не могут быть выведены из контекста использования.
тело выражения - либо простым expression'ом, либо statement'ом. Во втором случае оно должно быть взято в фигурные скобки.
Если тело содержит упоминания локльных переменных из контекста, в котором определяется лямбда, то эти переменные "сохраняются" вместе с лямбда-выражением (получается то самое "замыкание").
В твоём случае:
() => Console.Write(i);
мы имеем лямбду без аргументов (потому что "()" в начале), с expression'ом в качестве тела ("Console.Write(i)"), и которая захватывает одну переменную из внешнего контекста ('i').
Другой пример лямбды:
delegate void Command(Data data);
//...
Command cmd = (string data) => Console.WriteLine("Hello, " + data + "!");
Здесь мы имеем лямбду с одним типизированным аргументом "(string data)" и expression'ом в качестве тела ("Console.WriteLine("Hello, " + data + "!")"), которая ничего не захватывает из внешнего контекста.
Кстати говоря, в этом примере тип аргумента можно было бы опустить, т. к. он может быть выведен из типа делегата, которому присваивается результат. Т. е. запись могла бы быть такой:
Command cmd = data => Console.WriteLine("Hello, " + data + "!");
Подробности - здесь: http://msdn.microsoft.com/en-us/library/bb397687.aspx
А что непонятным осталось?