Делегат 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);
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 <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.
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();
}
}
Комментариев нет:
Отправить комментарий