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

Func делегат пример

Ну, есть ключевое слово delegate — это описание сигнатуры функции, т. е., её списка параметров и типа возвращаемого значения. Используется так:

public delegate bool MyPredicate(int x);

Им можно пользоваться так:

private bool IsOdd(int i) { return i % 2 != 0; }

private Analyze(MyPredicate p, int x)
{
    bool result = p(x);
    if (result)
        Console.WriteLine("found!");
}

Analyze(IsOdd, 1); // печатает "found!"

С другой стороны, есть готовые, предопределённые сигнатуры функций (Func<TArg1, TArg2, ..., TResult> с возвращаемым значением, Action<TArg1, Targ2, ...> без). 

То есть, можно не определять делегат самому, а воспользоваться готовыми Func и Action


Аналогичный пример:

private bool IsOdd(int i) { return i % 2 != 0; }

private Analyze(Func<int, bool> p, int x)
{
    bool result = p(x);
    if (result)
        Console.WriteLine("found!");
}

Analyze(IsOdd, 1); // печатает "found!"

Если для вашей сигнатуры подходит Func или Action, особого смысла определять свой делегат нет. 


Или есть, если вы хотите дать своему делегату более подходящее имя, чем просто Func, и хотите подчеркнуть его семантику.


Существуют случаи, когда свой делегат всё же необходимо объявлять. Например, наличие out- и ref-параметров:

public delegate Updater(ref int x); // невозможно выразить через Func

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

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

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

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