* При перепечатке материалов ссылка на www.SeoLiga.ru обязательна!
Замыкания (closure)
6 февраля 2009
Замыкания позволяют лямбда-выражениям захватывать внешние переменные и менять их значения, покажем как это происходит на примере того же факториала, но с одним допущением - будем считать, что нам нужно вычислить именно последовательный ряд значений факториала: int a = 1;
Func<int, long> Factorial = null; Factorial = (n) => { if (n > 1) a *= n; return a; }; for (int i = 0; i < 10; i++) { Console.WriteLine("{0}! = {1}", i, Factorial(i)); } как видишь, переменная а используется внутри лямбда-выражения, и в данном случае набор значений факториала вычисляется гораздо быстрее, чем в случае вычисления каждого значения независимо от других. Такой подход позволяет существенно ускорить вычисления по реккурентным соотношениям, но у него пока есть недостаток - строгая последовательность вызова. В следующем пункте мы рассморим как устранить этот недостаток при помощи мемоизации.