Etude exploratoire de Linq - CoDE - de l'Université libre de Bruxelles
Etude exploratoire de Linq - CoDE - de l'Université libre de Bruxelles
Etude exploratoire de Linq - CoDE - de l'Université libre de Bruxelles
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
class Exemple<br />
{<br />
static void f1() { Console.WriteLine("fct1"); }<br />
static void f2() { Console.WriteLine("fct2"); }<br />
}<br />
<strong>de</strong>legate void T(); //<strong>de</strong>claration du <strong>de</strong>legue<br />
static void Main(string[] args)<br />
{<br />
T <strong>de</strong>l = new T(f1);<br />
<strong>de</strong>l += new T(f2);<br />
}<br />
<strong>de</strong>l(); //execute les <strong>de</strong>ux fonctions pointees<br />
En lisant l’exemple ci-<strong>de</strong>ssus, la première chose qui va nous intéresser est la déclaration du délégué.<br />
Ceci correspond bien à une déclaration <strong>de</strong> type (ici un type nommé T) dont nous avons le choix <strong>de</strong><br />
son nom (T) et le mot clé <strong>de</strong>legate précise qu’il s’agit d’un type délégué. Il est possible d’ajouter au<br />
délégué une ou plusieurs références à <strong>de</strong>s fonctions à la condition que celles-ci respectent la<br />
signature du délégué (ici aucun paramètre et void comme retour). C’est ce dont il s’agit dans les <strong>de</strong>ux<br />
premières lignes <strong>de</strong> la métho<strong>de</strong> Main. Lorsqu’un délégué fait référence à plusieurs fonctions, il les<br />
exécute toutes dans l’ordre avec lequel elles ont été assignées au délégué. Ainsi, le co<strong>de</strong> <strong>de</strong><br />
l’exemple plus haut produirait en sortie le résultat suivant :<br />
Figure 1 : appels <strong>de</strong> délégués<br />
Le principe <strong>de</strong>s délégués est à la base <strong>de</strong>s expressions lambda fortement utilisées par <strong>Linq</strong>. Comme<br />
nous le verrons ces expressions sont spécialement utilisées dans la résolution <strong>de</strong>s clauses <strong>de</strong><br />
requêtes (select, where …).<br />
2.1.3 Métho<strong>de</strong>s anonymes<br />
Les métho<strong>de</strong>s anonymes ont été introduites avec la <strong>de</strong>uxième version <strong>de</strong> .NET. Il s’agit <strong>de</strong> suites<br />
d’instructions jouant le rôle d’une métho<strong>de</strong>, sans pour autant définir explicitement <strong>de</strong> fonction. Cela<br />
s’utilise en conjonction avec les délégués, <strong>de</strong> la manière suivante :<br />
<strong>de</strong>l += <strong>de</strong>legate { string text = "Il est " + DateTime.Now.ToString();<br />
Console.WriteLine(text); };<br />
En effet aucun nom <strong>de</strong> métho<strong>de</strong> n’a été spécifié. La seule contrainte d’utilisation est qu’il est<br />
impossible <strong>de</strong> faire marche arrière, puisque retirer la référence à cette métho<strong>de</strong> dans le délégué<br />
implique <strong>de</strong> pouvoir nommer cette référence. En poussant le raisonnement plus loin, pourquoi ne<br />
pas utiliser une métho<strong>de</strong> anonyme en paramètre d’une autre métho<strong>de</strong> ? La lisibilité et la<br />
compréhensibilité du co<strong>de</strong> s’en trouvent améliorées. <strong>Linq</strong> utilise les métho<strong>de</strong>s anonymes dans ce<br />
but, améliorer la lisibilité <strong>de</strong>s requêtes. Vouloir obtenir « tous les étudiants tels que leur moyenne est<br />
supérieure ou égale à 10 et les grouper par section » s’écrirait en pseudo co<strong>de</strong> :<br />
etudiants.Where(moyenne >= 10).Or<strong>de</strong>rBy(section).Select(etudiant);