// Выполнить проверку достоверности
return Add(x,y);
static int Add(int x, int y)
{
return x + y;
}
}
В версии C# 9.0 анонимные методы также могут быть помечены как статические с целью предохранения инкапсуляции и гарантирования того, что они не привнесут какие-либо побочные эффекты в код, где они содержатся. Вот как выглядит модифицированный анонимный метод:
c1.AboutToBlow += static delegate
{
// Этот код приводит к ошибке на этапе компиляции,
// потому что анонимный метод помечен как статический
aboutToBlowCounter++;
Console.WriteLine("Eek! Going too fast!");
};
Предыдущий код не скомпилируется из-за попытки анонимного метода получить доступ к переменной, объявленной вне области его действия.
Использование отбрасывания с анонимными методами (нововведение в версии 9.0)
Отбрасывание, представленное в главе 3, в версии C# 9.0 было обновлено с целью применения в качестве входных параметров, но с одной уловкой. Поскольку символ подчеркивания (_) в предшествующих версиях C# считался законным идентификатором переменной, в анонимном методе должно присутствовать два и более подчеркиваний, чтобы они трактовались как отбрасывание.
Например, в следующем коде создается делегат Func<>, который принимает два целых числа и возвращает еще одно целое число. Приведенная реализация игнорирует любые переданные переменные и возвращает значение 42:
Console.WriteLine("******** Discards with Anonymous Methods ********");
Func
Console.WriteLine("constant(3,4)={0}",constant(3,4));
Понятие лямбда-выражений
Чтобы завершить знакомство с архитектурой событий .NET Core, необходимо исследовать
В целях подготовки фундамента для изучения лямбда-выражений создайте новый проект консольного приложения по имени LambdaExpressions. Для начала взгляните на метод FindAll() обобщенного класса List. Данный метод можно вызывать, когда нужно извлечь подмножество элементов из коллекции; вот его прототип:
// Метод класса System.Collections.Generic.List
public List
Как видите, метод FindAll() возвращает новый объект List, который представляет подмножество данных. Также обратите внимание, что единственным параметром FindAll() является обобщенный делегат типа System.Predicate, способный указывать на любой метод, который возвращает bool и принимает единственный параметр:
// Этот делегат используется методом FindAll()
// для извлечения подмножества.
public delegate bool Predicate
Когда вызывается FindAll(), каждый элемент в List передается методу, указанному объектом Predicate. Реализация упомянутого метода будет выполнять некоторые вычисления для проверки соответствия элемента данных заданному критерию, возвращая в результате true или false. Если метод возвращает true, то текущий элемент будет добавлен в новый объект List, который представляет интересующее подмножество.
Прежде чем мы посмотрим, как лямбда-выражения могут упростить работу с методом FindAll(), давайте решим задачу длинным способом, используя объекты делегатов непосредственно. Добавьте в класс Program метод (TraditionalDelegateSyntax()), который взаимодействует с типом System.Predicate для обнаружения четных чисел в списке List целочисленных значений:
using System;
using System.Collections.Generic;
using LambdaExpressions;
Console.WriteLine("***** Fun with Lambdas *****\n");
TraditionalDelegateSyntax();
Console.ReadLine();
static void TraditionalDelegateSyntax()
{