Explication de Func

Je me demandais si quelqu’un pouvait expliquer ce que Func est et comment il est utilisé avec des exemples clairs.

Êtes-vous familier avec les delegates en général? J’ai une page sur les delegates et les événements qui peut aider si ce n’est pas le cas, même si elle est plus orientée vers l’explication des différences entre les deux.

Func est simplement un délégué générique – Func ce que cela signifie dans une situation particulière en remplaçant les parameters de type ( T et TResult ) par les arguments de type correspondants ( int et ssortingng ) dans la déclaration. Je l’ai également renommé pour éviter toute confusion:

 ssortingng ExpandedFunc(int x) 

En d’autres termes, Func est un délégué qui représente une fonction prenant un argument int et renvoyant une ssortingng .

Func est souvent utilisé dans LINQ, à la fois pour les projections et les prédicats (dans ce dernier cas, TResult est toujours TResult ). Par exemple, vous pouvez utiliser Func pour projeter une séquence d’entiers dans une séquence de chaînes. Les expressions lambda sont généralement utilisées dans LINQ pour créer les delegates appropriés:

 Func projection = x => "Value=" + x; int[] values = { 3, 7, 10 }; var ssortingngs = values.Select(projection); foreach (ssortingng s in ssortingngs) { Console.WriteLine(s); } 

Résultat:

 Value=3 Value=7 Value=10 

Un Func mange des ints et retourne des chaînes. Alors, qu’est-ce qui mange ints et retourne des chaînes? Que dis-tu de ça …

 public ssortingng IntAsSsortingng( int i ) { return i.ToSsortingng(); } 

Là, je viens de créer une fonction qui mange ints et retourne des chaînes. Comment pourrais-je l’utiliser?

 var lst = new List() { 1, 2, 3, 4, 5 }; ssortingng str = Ssortingng.Empty; foreach( int i in lst ) { str += IntAsSsortingng(i); } // str will be "12345" 

Pas très sexy, je sais, mais c’est l’idée simple que beaucoup de trucs sont basés sur. Maintenant, utilisons un Func à la place.

 Func fnc = IntAsSsortingng; foreach (int i in lst) { str += fnc(i); } // str will be "1234512345" assuming we have same str as before 

Au lieu d’appeler IntAsSsortingng sur chaque membre, j’ai créé une référence appelée fnc (ces références aux méthodes sont appelées delegates ) et je l’ai utilisée à la place. (Rappelez-vous que fnc mange des ints et retourne des chaînes).

Cet exemple n’est pas très sexy, mais une tonne de choses intelligentes que vous verrez est basée sur l’idée simple de fonctions, de delegates et de méthodes d’extension .

L’un des meilleurs documents sur ce que j’ai vu est ici . Il a beaucoup plus d’exemples réels. 🙂

C’est un délégué qui prend un int comme paramètre et renvoie une valeur de type ssortingng .

Voici un exemple d’utilisation:

 using System; class Program { static void Main() { Func func = bar; // now I have a delegate which // I can invoke or pass to other // methods. func(1); } static Ssortingng bar(Int32 value) { return value.ToSsortingng(); } } 

Func accepte un paramètre int value et renvoie une valeur de chaîne. Voici un exemple où une méthode de support supplémentaire est inutile.

 Func GetDogMessage = dogAge => { if (dogAge < 3) return "You have a puppy!"; if (dogAge < 7) return "Strong adult dog!"; return "Age is catching up with the dog!"; }; string youngDogMessage = GetDogMessage(2); 

REMARQUE: Le dernier type d'object dans Func (c'est-à-dire "ssortingng" dans cet exemple) est le type de retour des fonctions (c'est-à-dire non limité aux primitives, mais à tout object). Par conséquent, Func accepte les parameters de valeur int et bool et renvoie une valeur flottante.

 Func WorthlessFunc = (intValue, boolValue) => { if(intValue > 100 && boolValue) return 100; return 1; }; float willReturn1 = WorthlessFunc(21, false); float willReturn100 = WorthlessFunc(1000, true); 

HTH