В чём разница между Func

По большому счёту что Func<> что Action<> являются системными обобщёнными делегатами. В чём же между ними разница? Когда стоит использовать один, а когда другой?

Делегат Action<> принимает какие-то параметры но не возвращает значение (точнее возвращаемое значение является void). Он может принимать n-ное кол-во параметров, но ни в коем случае не будет возвращать никаких переменных в результате.

Func<> это делегат, который имеет какое-то возвращаемое значение и может также принимать параметры. В его сигнатуре он должен как минимум возвращать что-то.

Из всего вышеперечисленного мы можем сделать вывод, что Action<> нам стоит использовать в случае если нам не нужно возвращать значение, а Func<> --- когда без возвращаемого значения нам не обойтись никак. На своей практике мне приходилось использовать только Func<>. Ниже приведу пару примеров сигнатуры этого делегата:

В записи:

Func func = (a) => { return true; };

наш делегат func принимает один int аргумент и возвращает нам bool результат.

В записи:

Func func = (b, c) => { return "Hello World!"; };

наш делегат func имеет 2 аргумента с типом double и будет возвращать нам строку "Hello World".

Ещё существует делегат Predicate<>. Данный делегат используется когда нам нужно сравнить какие-либо значения. Тип возвращаемого значения в данном случае будет bool.