netrox
@netrox

Как работает данный код?

using System;
 
delegate int CountIt(int end);
class VarCapture
{
    static CountIt Counter()
    {
        int sum = 0;
     
        CountIt ctObj = delegate(int end)
        {
            for (int i = 0; i <= end; i++)
            {
                Console.WriteLine(i);
                sum += i;
            }
            return sum;
        };
        return ctObj;
    }
    static void Main()
    {
        // Получить результат подсчета.
        CountIt count = Counter();
        int result;
        result = count(3);
        Console.WriteLine("Сумма 3 равна " + result);
        Console.WriteLine();
        result = count(5);
        Console.WriteLine("Сумма 5 равна " + result);
    }
}

Почему в данном фрагменте требуется создать доп. метод Count ? В книге написано , что это делается для сохранения значения перем. sum ,но если убрать метод то тогда анонимный метод не видит перем. sum. Можете описать ,как устроен этот процесс ?
  • Вопрос задан
  • 303 просмотра
Пригласить эксперта
Ответы на вопрос 2
@abcd0x00
Почему в данном фрагменте требуется создать доп. метод Count ?

Когда ты его вызываешь, создаётся замыкание, в котором в переменной sum накапливается значение при каждом вызове. И таких замыканий можно сделать несколько независимых друг от друга.
CountIt c1 = Counter();
CountIt c2 = Counter();
CountIt c3 = Counter();

Для того они и используются. Между вызовами что-то сохраняется в переменную и для каждого замыкания эта переменная своя собственная.
Ответ написан
Комментировать
При вызове counter - создается переменная sum и возвращается работающая с ней функция.
Т.е. после вызова Counter - sum == 0.
После первого вызова делегата - sum == 0 + (1+2+3) = 6
После второго вызова делегата - sum == 6 + (1+2+3+4+5) = 21
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы