На этом шаге мы рассмотрим еще одну программу, иллюстрирующую возможности использования анонимных методов.
Анонимный метод может возвращаться в качестве результата другого метода. В примере ниже это проиллюстрировано.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace pr176_1 { // Объявление делегата: delegate int MyDelegate(); // Класс с главным методом: class Program { // Статический метод результатом возвращает ссылку на // экземпляр делегата: static MyDelegate calculate(int n) { // Локальная переменная: int count = 0; // Результат реализован через анонимный метод: return delegate() { count += n; return count; }; } // Главный метод: static void Main() { // Переменная типа делегата: MyDelegate next = calculate(1); for (int i = 1; i <= 5; i++) { // Вызов экземпляра делегата: Console.Write(next() + " "); } Console.WriteLine(); // Новое значение переменной типа делегата: next = calculate(3); for (int i = 1; i <= 5; i++) { // Вызов экземпляра делегата: Console.Write(next() + " "); } Console.WriteLine(); // Задержка: Console.ReadLine(); } } }
При выполнении программы получаем такой результат:

Рис.1. Результат выполнения программы
Делегат MyDelegate описан для создания экземпляров, которые могут ссылаться на методы без аргументов, возвращающие целочисленный результат. Еще мы описываем статический метод calculate(), у которого целочисленный аргумент (обозначен как n) и который результатом возвращает ссылку на экземпляр делегата MyDelegate. В теле метода объявлена локальная целочисленная переменная count с начальным нулевым значением. Далее следует return-инструкция и возвращаемым значением указано следующее выражение (после этого выражения в коде метода стоит точка с запятой):
return delegate() { count += n; return count; };
Это код анонимного метода без аргументов, который результатом возвращает целое число. Этот анонимный метод возвращается результатом метода calculate().
Тип результата для метода calculate() указан как MyDelegate. Формально это ссылка на экземпляр делегата MyDelegate. При вызове метода calculate() под результат метода
выделяется переменная типа делегата MyDelegate. Результатом метод calculate() возвращает анонимный метод, который присваивается переменной, выделенной для записи результата.
В итоге создается экземпляр делегата, который ссылается на анонимный метод. Ссылка на этот экземпляр записывается в переменную, выделенную для запоминания результата метода calculate().
Поэтому результатом метода calculate() является ссылка на экземпляр делегата MyDelegate, а этот экземпляр ссылается на упомянутый выше анонимный метод.
В главном методе программы командой
MyDelegate next = calculate(1);
После выполнения команды
next = calculate(3);
На следующем шаге мы закончим изучение этого вопроса.