воскресенье, 9 января 2022 г.

Делегат Func

Делегат Func предназначен для инкапсуляции метода, который принимает в качестве параметров от нуля до четырех аргументов и возвращает значение

Что же касается делегата Action, то единственное отличие его от Func – это то, что Action возвращает процедуру.


Эти делегаты могут использоваться, чтобы сократить количество делегатов (извините за каламбур).

Самый простой вариант Func это Func<TResult>. Этот делегат представляет метод, который возвращает значение и при этом не имеет никаких параметров.  Новый делегат использует анонимный метод, который возвращает double значение. Код ниже демонстрирует это.

Func<double> doub = delegate { return 34.4; };
Console.WriteLine(doub()); 

Такую же функциональность можно реализовать при помощи лямбда-выражений:

Func<double> doub = ()=> { return 34.4; };
Console.WriteLine(doub());

А теперь проделаем тоже самое, но только уже с параметрами:

Func<byte, byte, byte, int> plus = delegate(byte q, byte w, byte e) { return q + w + e; };
Console.WriteLine(plus(1, 2, 3));

А теперь тоже самое, только уже через лямбда-выражения:

Func<byte, byte, byte, int> plus2 = (byte q, byte w, byte e) => { return q + w + e; };
Console.WriteLine(plus2(4, 5, 6));

Вместо определения нового типа делегата с каждым типом параметра и возврата можно использовать делегат Func<T>. 

Func<T> позволяет вызывать методы с типом возврата. 

Подобно Action<T>, Func<T> определен в разных вариантах для передачи до 16 типов параметров и типа возврата. 

Func<out TResult> — тип делегата для вызова метода с типом возврата, но без параметров

Func<in T1, out TResult> — для метода с одним параметром

Func<in T1, in T2, in ТЗ, in T4, out TResult> — для метода с четырьмя параметрами.


=======================

Пример использования делегатов

Делегат Func обычно используется как тип для параметров методов, которые принимают лямбды-выражения. Они включают стандартные операторы запросов LINQ и подобные методы, которые Вы используете в своих собственных проектах. Покажу как работает на заключительном примере этой статьи.

Метод Fruit определяет строковый массив содержащий наименования фруктов. Метод возвращает фильтрованные фрукты на основании Func делегата, который указан в сигнатуре метода. Func делегат инкапсулирует метод, который принимает один строковый параметр и возвращает булево значение. Мы можем использовать результат метода Fruit в операторе foreach для вывода фруктов, которые удовлетворяют условию запросу where.

private static string[] Fruit(Func<string, bool> filter)
{
    string[] fruit = new string[]
    {
        "Манго", "Банан", "Вишня", "Чернослив", "Ежевика",
        "Фига", "Грейпфрукт", "Черника", "Лимон", "Яброко"
    };
    return fruit.Where(filter).ToArray();
}

Для вывода на экран воспользуемся методом, который был реализован в одном из примеров. Результатом вызова метода:

string[] fruits = Fruit(f => f.StartsWith("Ч"));
foreach (string item in fruits)
{
   sm1(item);
}

будет:

Чернослив
Черника

Или вот другой пример вызова метода Fruit:

string[] fruits2 = Fruit(f => f.Length <6);
foreach (string item in fruits2)
{
    sm1(item);
}

на экран будет выведено:

Манго
Банан
Вишня
Фига
Лимон

Всё элементарно и просто… Не правда ли? 🙂

=====================================



В примере использован следующий делегат:


public delegate double MathDelegate(double value1, double value2);


Но, Вы можете заменить этот делегат одним из встроенных типов, 
а именно Func <int, int, int>.

вот так,

class Program
    {
        public static void Main()
        {
            Func<int, int, int> mathDelegate = (x,y) => 
            {
                Console.WriteLine("Add");
                return x + y;
            };

            var result = mathDelegate(5, 2);
            Console.WriteLine(result);
            // вывод: 7

            mathDelegate = (x, y) => x - y; ;
            result = mathDelegate(5, 2);
            Console.WriteLine(result);
            // вывод: 3

            Console.ReadLine();
        }

    }

Типы Func <...> можно найти в пространстве имен System. 

Они представляют делегаты, которые возвращают тип и принимают от 0 до 16 параметров. 

Все эти типы наследуются от System.MulticaseDelegate для того, чтобы вы могли добавить несколько методов в список вызовов.

Func<T>

Также как и Action, делегат Func не шаблонизирован, в разных версиях NET.FrameWork имеет от 4 до 16 видов объявлений, которые различаются количеством параметров.

Его общее объявление: TResult Func<in T, out TResult>(T arg).

Делегат возвращает значение любого пользовательского или встроенного типа (TResult) может принимать параметры любого типа (Т): от 1 до 16.

Func применяется как делегат, передаваемый в качестве параметра другому методу: для алгоритмов расчёта, сортировки или встроенных методов:


using System;


public class FuncExample

{

public static void Main()

{

Func<string, string> MethodConvert = ConvertUserString;

string str = "Владимир";

Console.WriteLine(MethodConvert(str));

}


private static string ConvertUserString(string impStr)

{

result = impStr + DateTime.Now.Hour.ToString();


return result.ToUpper();

}

}







Комментариев нет:

Отправить комментарий

Паттерн 'Репозиторий' в ASP.NET

  Последнее обновление: 1.11.2015         Одним из наиболее часто используемых паттернов при работе с данными является паттерн 'Репозито...