12.07.2013 Views

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

SHOW MORE
SHOW LESS

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);

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!