Un Func
è solo un tipo speciale di (ben una famiglia di, davvero) delegato. Naturalmente, C # sarebbe completo, anche senza di loro, quindi ovviamente nessuno li "ha bisogno" di loro, è solo che fanno un sacco di cose MOLTO più semplice design e sintassi-saggio.
Assumono un ruolo simile ai puntatori di funzioni in linguaggi come C. È fondamentalmente un modo per separarti da un metodo specifico e dipendono invece da una classe polimorfica ("classe" in un senso non OOP) di metodi.
Un esempio piuttosto semplice quando sono utili è il metodo map
nel funcion IEnumerable<T>
(chiamato Select
in C #):
public static IEnumerable<TResult> Select<T, TResult>(this IEnumerable<T> xs, Func<T, TResult> f)
{
foreach (var x in xs) yield return f(x);
}
Ora può essere richiamato tramite new[] {1,2,3}.Select(x => x*2)
invece di definire un'interfaccia one-method som e creare un'intera classe solo per moltiplicare un numero per 2.
Denominare e posizionare esplicitamente ogni piccolo lambda in una classe in un namespace farebbe solo gonfiare le cose e non aggiungere chiarezza.