Func<>
est un délégué générique - il est très pratique à utiliser, car vous n'avez pas besoin de créer votre propre délégué pour chaque combinaison argument/type de retour.
Plus tôt, il fallait écrire quelque chose comme:
public delegate long MyDelegate(int number);
public void Method(IEnumerable<int> list, MyDelegate myDelegate)
{
foreach(var number in list)
{
myDelegate(number);
}
}
Il fallait publier votre délégué de sorte qu'un utilisateur peut appeler votre méthode correctement. Surtout quand vous avez besoin d'un groupe de délégués différents, vous avez fini par en publier un pour chaque liste d'arguments et le type de retour.
Avec Func<>
vous venez d'écrire:
public void Method(IEnumerable<int> list, Func<int, long> myDelegate)
{
foreach(var number in list)
{
myDelegate(number);
}
}
Cela signifie la même chose que le premier exemple de code - Func<int, long>
définit un délégué qui prend un argument entier et renvoie une valeur à long.
Bien sûr, vous pouvez utiliser des listes de paramètres plus aussi: Func<int, int, bool, long>
retournera encore valeur longue alors qu'il faut deux ints et une bool valeur. Si vous souhaitez un délégué sans valeur de retour, vous devrez utiliser Action<>
, qui aura void comme type de retour.
EDIT (sur demande): Comment appeler la méthode dans mon exemple:
Pour l'appelant, il n'y a pas de différence entre la solution avec MyDelegate
ou Func<>
. Dans les deux cas, il a trois options pour appeler la méthode:
utilisant une notation lambda (C# 3.0 nécessaire, probablement la meilleure solution pour de courtes méthodes):
Method(myList, i => i * i);
En utilisant une méthode anonyme (C# 2.0 nécessaire):
Method(myList, delegate(int i)
{
return i * i;
});
Ou en utilisant une vraie méthode comme argument:
Method(myList, Square);
private static long Square(int number)
{
return number * number;
}
Le livre de Jon Skeet sur c sharp a quelques excellents chapitres sur ce sujet et pourquoi il est si important pour les fonctions lambda et linq. –
Il n'y a rien d'effrayant, et aucune raison d'éviter, les délégués Func ou génériques - ce sont simplement des délégués qui représentent des méthodes générales qui prennent un certain nombre d'arguments. – thecoop
Vous voudrez peut-être regarder les différentes questions Func sur SO: http://stackoverflow.com/questions/tagged/func –