C# vous permet de passer des méthodes en tant que paramètres à des fonctions, améliorant considérablement la flexibilité et la réutilisabilité du code. Cette capacité est essentielle pour implémenter des rappels, des gestionnaires d’événements et des modèles stratégiques où le comportement d’exécution dicte l’action spécifique. Cet article explore différentes approches pour y parvenir, en se concentrant sur les délégués personnalisés, Func<>
et Action<>
.
Table des matières
- Utilisation de délégués personnalisés pour passer des méthodes en tant que paramètres
- Exploitation du délégué
Func<>
- Utilisation du délégué
Action<>
- Conclusion
Utilisation de délégués personnalisés pour passer des méthodes en tant que paramètres
Les délégués en C# servent de pointeurs de fonction type-safe. La création d’un délégué personnalisé offre un contrôle granulaire et une clarté lorsque la signature de la méthode diffère des délégués Func<>
ou Action<>
intégrés. Considérons une fonction effectuant une opération sur un nombre puis affichant le résultat, l’opération elle-même étant un paramètre.
// Définition d'un délégué personnalisé
public delegate double MathOperation(double x);
public class Example
{
public static void PerformOperationAndPrint(double num, MathOperation operation)
{
double result = operation(num);
Console.WriteLine($"Resultat : {result}");
}
public static double Square(double x) => x * x;
public static double Cube(double x) => x * x * x;
public static void Main(string[] args)
{
PerformOperationAndPrint(5, Square); // Sortie : Resultat : 25
PerformOperationAndPrint(5, Cube); // Sortie : Resultat : 125
}
}
MathOperation
agit comme un délégué représentant une méthode acceptant un double
et retournant un double
. PerformOperationAndPrint
accepte ce délégué, permettant l’utilisation de Square
, Cube
ou de toute méthode conforme.
Exploitation du délégué Func<>
Func<>
est un délégué générique représentant une méthode avec zéro ou plusieurs paramètres d’entrée et une valeur de retour. Sa nature intégrée simplifie de nombreux scénarios. Refactorisons l’exemple précédent :
public class Example
{
public static void PerformOperationAndPrint(double num, Func<double, double> operation)
{
double result = operation(num);
Console.WriteLine($"Resultat : {result}");
}
public static double Square(double x) => x * x;
public static double Cube(double x) => x * x * x;
public static void Main(string[] args)
{
PerformOperationAndPrint(5, Square); // Sortie : Resultat : 25
PerformOperationAndPrint(5, Cube); // Sortie : Resultat : 125
}
}
Cela donne le même résultat avec moins de code. Func<double, double>
spécifie une méthode acceptant un double
et retournant un double
. Les paramètres de type générique s’adaptent à diverses signatures de méthode (par exemple, Func<int, string>
).
Utilisation du délégué Action<>
Action<>
est un délégué générique pour les méthodes avec zéro ou plusieurs paramètres d’entrée et un type de retour void
(pas de valeur de retour). Utilisez-le lorsque les méthodes ne retournent pas de valeurs.
public class Example
{
public static void PerformAction(string message, Action<string> action)
{
action(message);
}
public static void PrintMessage(string msg) => Console.WriteLine(msg);
public static void PrintMessageToUpper(string msg) => Console.WriteLine(msg.ToUpper());
public static void Main(string[] args)
{
PerformAction("Hello, world!", PrintMessage); // Sortie : Hello, world!
PerformAction("Hello, world!", PrintMessageToUpper); // Sortie : HELLO, WORLD!
}
}
Action<string>
représente une méthode acceptant une chaîne et ne retournant rien. PerformAction
l’utilise pour exécuter diverses actions d’impression.
Conclusion
Passer des méthodes en tant que paramètres est une fonctionnalité C# puissante. Les délégués personnalisés offrent un contrôle maximal, tandis que Func<>
et Action<>
fournissent des solutions intégrées pratiques. La meilleure approche dépend des exigences spécifiques de votre application. La maîtrise de ces techniques est essentielle pour écrire du code C# plus adaptable et maintenable.