Programmation Fonctionnelle
Fonction de première classe
C# supporte les fonctions de première classes (first-class functions) car il permet de manipuler des fonctions comme des variables, ceci notamment grace aux délégués.
Délégués
Les délégués (delegates) sont le super de première classe pour les fonctions en C#. Les délégués sont des pointeurs de fonction typés, qui permettent de manipuler les méthodes comme des variables et de les appeler. Le délégué se définit avec le mot-clé delegate
et contraint la signature de fonction correspondante :
public delegate int MathOperation(int leftOperand, int rightOperand);
public class Addition{
public int Add(int leftOperand, int rightOperand) => leftOperand + rightOperand;
}
MathOperation addition = new Addition().Add;
On peut ensuite exécuter la méthode à partir de cette variable :
var result = addition.Invoke(4,2);
var result = addition(4,2);
Lambdas
On peut aussi utiliser la syntaxe lambda pour définir des fonctions anonymes, et les assigner à des délégués :
Lambda "expression body" :
MathOperation addition = (int left, int right) => left + right;
Lambda normale :
MathOperation addition = (int left, int right) => {
return left + right;
};
LinQ
LinQ, pour Language Integrated Queries est une fonctionnalités de C# qui permet d'utiliser les opérateurs fonctionnels sur les collections.
IEnumerable
L'interface IEnumerable
est une abstraction de toute collection sur laquel fonctionne LinQ. Pour générer une IEnumerable
dans une méthode, on utilise le mot clé yield
:
public static IEnumerable<int> Power(int number, int exponent)
{
int result = 1;
for (int i = 0; i < exponent; i++)
{
result = result * number;
yield return result;
}
}
On peut ainsi l'énumérer comme une collection avec une boucle foreach
:
foreach (int i in Power(2, 8))
{
Console.Write("{0} ", i);
}
Opérateurs fonctionels sur collections
LinQ fournit des opérateur fonctionels pour écrire du code très expressif de traitement des collection.collections (toutes les collections de la Base Class Library (BCL) implémentent IEnumerable
). Le nommage des méthodes rappellesrappellent le SQL. LinQ peut s'exécuter sur des données en mémoire ou en dehors du système par le biais des arbres d'expressions. Les méthodes LinQ ont en argument des délégués, on les utilise souvent en passant des lambdas.
public class User {
public string Name{get;set;}
public int Age {get;set;}
}
List<Userstring> adultsNames = users
.Where(user => user.Age >= 18)
.Select(user => user.Name)
.ToList();