Les délégates ou comment passer une fonction en paramètre…

Les délégates ou comment passer une fonction en paramètre…

On connais tous les pointeurs de fonction en C par exemple ainsi que leur lot de problème (enfin pour moi) et pour ceux qui ne les connaissent pas les pointeurs, un petit récapitulatif peut être trouvé sur le site :).

A quoi servent les délégates ?

Je dois vous avouer que je n’ai compris leur utilité que 2 semaines avant d’écrire ce post ! Je suis donc un Noob au niveau des délégates. Alors pour résumer, les délégates sont des variables capablent de stocker des fonctions avec une signature particulière.
Plus particulièrement : Je crée une classe de threading, on le sait tous, le but des threads est de travailler en parrallèle pour le processus. Mais il faut bien qu’il fasse un rapport, non ? Les délégates interviènnent ici : Dans l’instanciation de la classe (ThreadClass tc = new ThreadClass(…)) on lui passe un délégate d’une fonction Log en paramètre pour que les threads puissent faire un compte rendu.

Comment les déclare t’on ?

On dois préparer le terrain en plusieur fois :

public delegate void FonctionLog(string msg);

Cette ligne signifie plusieurs choses :

  • public : pour rendre le délégate public (j’y reviendrai tout à l’heure)
  • void : notre fonction de log ne retournera rien
  • FonctionLog : Le nom du delegate (pas d’une quelconque fonction)
  • (…) : ses paramètres

Donc FonctionLog est un délégate qui permettra d’encapsuler une fonction de signature “void xxx(string)”
Dans ma classe j’inclus donc ma définition de délégate…
Comment les utilise t’on ?
Maintenant passons à la pratique, pour les utiliser voici le code :
Dans votre classe :

public delegate void FonctionLog(string msg);
FonctionLog Fonc;
public ThreadClass(FonctionLog fl, ...)
{
Fonc = fl;
}

Dans votre programme principal :

public void LogThis(string ToLog)
{
//...
}
public FonctionQuiUtiliseLesThreads()
{
ThreadClass tc = new ThreadClass(new ThreadClass.FonctionLog(LogThis));
}

La seule difficulté ici réside dans le code

new ThreadClass.FonctionLog(LogThis)

qui est la méthode d’utilisation des délégates.

Quelques précisions

new ThreadClass(…) attends absolument une FonctionLog, il faut donc que, lors d’une utilisation interClasse, le délégate soit public.
Dans une utilisation dans la même classe (quel intéret ?), le délégate peut être privé.

2 réflexions sur « Les délégates ou comment passer une fonction en paramètre… »

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *