};
count(3);
Console.WriteLine();
count(5);
}
}
В этом варианте программы делегат CountItпринимает целочисленный аргумент. Обратите внимание на то, что при создании анонимного метода список параметров указывается после ключевого слова delegate. Параметр endстановится доступным для кода в анонимном методе таким же образом, как и при создании именованного метода. Ниже приведен результат выполнения данной программы.
0
1
2
3
0
1
2
3
4
5
Возврат значения из анонимного метода
Анонимный метод может возвращать значение. Для этой цели служит оператор return, действующий в анонимном методе таким же образом, как и в именованном методе. Как и следовало ожидать, тип возвращаемого значения должен быть совместим с возвращаемым типом, указываемым в объявлении делегата. В качестве примера ниже приведен код, выполняющий подсчет с суммированием и возвращающий результат.
// Продемонстрировать применение анонимного метода,
//возвращающего значение.
using System;
// Этот делегат возвращает значение,
delegate int CountIt(int end);
class AnonMethDemo3 {
static void Main() {
int result;
// Здесь конечное значение для подсчета передается анонимному методу.
//А возвращается сумма подсчитанных чисел.
CountIt count = delegate (int end) {
int sum = 0;
for(int i=0; i <= end; i++) {
Console.WriteLine(i);
sum += i;
}
return sum; // возвратить значение из анонимного метода
};
result = count(3);
Console.WriteLine("Сумма 3 равна " + result);
Console.WriteLine();
result = count (5);
Console.WriteLine("Сумма 5 равна " + result);
}
}
В этом варианте кода суммарное значение возвращается кодовым блоком, связанным с экземпляром делегата count. Обратите внимание на то, что оператор return применяется в анонимном методе таким же образом, как и в именованном методе. Ниже приведен результат выполнения данного кода.
0
1
2
3
Сумма 3 равна 6
0
1
2
3
4
5
Сумма 5 равна 15
Применение внешних переменных в анонимных методах
Локальная переменная, в область действия которой входит анонимный метод, называется внешней переменной. Такие переменные доступны для использования в анонимном методе. И в этом случае внешняя переменная считается захваченной. Захваченная переменная существует до тех пор, пока захвативший ее делегат не будет собран в "мусор". Поэтому если локальная переменная, которая обычно прекращает свое существование после выхода из кодового блока, используется в анонимном методе, то она продолжает существовать до тех пор, пока не будет уничтожен делегат, ссылающийся на этот метод.
Захват локальной переменной может привести к неожиданным результатам. В качестве примера рассмотрим еще один вариант программы подсчета с суммированием чисел. В данном варианте объект CountItконструируется и возвращается статическим методом Counter(). Этот объект использует переменную sum, объявленную в охватывающей области действия метода Counter(), а не самого анонимного метода. Поэтому переменная sum захватывается анонимным методом. Метод Counter()вызывается в методе Main()для получения объекта CountIt, а следовательно, переменная sum не уничтожается до самого конца программы.
// Продемонстрировать применение захваченной переменной,
using System;
// Этот делегат возвращает значение типа int
Читать дальше