example - metanit c# action




Func vs. Action vs. Predicate (2)

Func - если требуется делегат для функции, которая может или не может принимать параметры и возвращает значение. Наиболее распространенным примером может быть выбор из LINQ:

var result = someCollection.Select( x => new { x.Name, x.Address });

Действие. Если вам нужен делегат для функции, которая может или не может принимать параметры и не возвращает значение. Я часто использую их для анонимных обработчиков событий:

button1.Click += (sender, e) => { /* Do Some Work */ }

Предикат. Если вам нужна специализированная версия Func, которая оценивает значение по набору критериев и возвращает логический результат (true для соответствия, в противном случае - false). Опять же, они используются в LINQ довольно часто для таких вещей, как Where:

var filteredResults = 
    someCollection.Where(x => x.someCriteriaHolder == someCriteria);

Я просто дважды проверил, и оказалось, что LINQ не использует Predicates. Не знаю, почему они приняли это решение ... но теоретически это все еще ситуация, в которой будет существовать Предикат.

На этот вопрос уже есть ответ:

С реальными примерами и их использованием, кто-то может помочь мне понять:

  1. Когда нам нужен делегат Func?
  2. Когда нам нужен делегат Action?
  3. Когда нам нужен делегат Predicates?

Действие - это делегат (указатель) к методу, который принимает нуль, один или несколько входных параметров, но ничего не возвращает.

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

Предикат - это особый вид Func, который часто используется для сравнения.

Хотя он широко используется с Linq, Action и Func - понятия, логически независимые от Linq. C ++ уже содержал базовую концепцию в виде типизированных указателей функций.

Вот небольшой пример для Action и Func без использования Linq:

class Program
{
    static void Main(string[] args)
    {
        Action<int> myAction = new Action<int>(DoSomething);
        myAction(123);           // Prints out "123"
                                 // can be also called as myAction.Invoke(123);

        Func<int, double> myFunc = new Func<int, double>(CalculateSomething);
        Console.WriteLine(myFunc(5));   // Prints out "2.5"
    }

    static void DoSomething(int i)
    {
        Console.WriteLine(i);
    }

    static double CalculateSomething(int i)
    {
        return (double)i/2;
    }
}






delegates