Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

C# : Petit gag avec les méthodes anonymes

J'utilise les méthodes anonymes depuis que j'ai VS 2005. Pourtant tout à l'heure je me suis demandé comment fonctionnait précisément l'accès aux variables définies à l'exterieur du délégué. Par exemple lorsque vous faites ça (avec la variable x) :

int x = 0;
Action<string> del = delegate(string s)
               {
                     Console.WriteLine(s + " " + x.ToString());
               };

En cherchant des détails sur Internet je me suis rendu compte que ce n'était pas si intuitif que ça, regardez ces 2 programmes :

delegate void Foo();
public static void Main()
{
      List<Foo> myFuncs = new List<Foo>();
      for(int i = 0; i < 3; i++)
      {
            int x = i*2;

            Foo anonFunc = delegate
            {
                  Console.WriteLine("x == {0}", x);
            };
            myFuncs.Add(anonFunc);
      }

      foreach(Foo anonFunc in myFuncs)
            anonFunc();
}

Celui là produit la sortie suivante :

x == 0
x == 2
x == 4

En faisant une légère modification au programme :

delegate void Foo();
public static void Main()
{
      List<Foo> myFuncs = new List<Foo>();
      int x;
      for(int i = 0; i < 3; i++)
      {
            x = i*2;

            Foo anonFunc = delegate
            {
                  Console.WriteLine("x == {0}", x);
            };
            myFuncs.Add(anonFunc);
      }

      foreach(Foo anonFunc in myFuncs)
            anonFunc();
}

On a alors le résultat suivant :

x == 4
x == 4
x == 4

Ceci est dû au fait que lorsqu'on utilise des variables externes à la méthode anonyme, celles-ci sont comme passées par référence. Dans le 1er programme on a une référence différente à chaque passage de la boucle puisque on passe sur l'instruction int x à chaque passage, alors que dans le 2e cas, c'est toujours la même variable qui est passée par référence.

Publié vendredi 16 juin 2006 14:19 par RaptorXP
Classé sous : , ,
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

# re: C# : Petit gag avec les méthodes anonymes

Les méthodes anonymes ça semble simple mais le code IL généré est pas simple du tout. : /

Le compilateur capture la variable x dans une classe et dans le 2ème exemple il capture la variable x à chaque passage dans la boucle.

samedi 17 juin 2006 01:04 by Lutinore
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- [WPF] Nouvel article sur c2i.fr par Richard Clark le il y a 14 heures et 32 minutes

- F# nouvelle CTP 1.9.6.2 (update) par Pierrick's Blog le il y a 18 heures et 37 minutes

- La suite ...Proposition de collaboration rédactionnelle entre les communautés de développeurs et Microsoft France par LucasR le 09-05-2008, 17:45

- [Fun] Votre simulateur de vol avec Microsoft ESP par Julien Chable le 09-05-2008, 12:02

- [Best Practices] Customisation du My Site : Comment le modifier en amont et en aval par The Mit's Blog le 09-05-2008, 10:47

- Patrick Tisseghem s'en est allé ... par The Mit's Blog le 09-05-2008, 10:04

- MS AutoCollage par alex# le 09-05-2008, 09:18

- Un grand SharePointeur nous a quitte : Patrick Tisseghem manquera à la communauté ! par RedoBlog - The .NET Gentleman !!! le 09-05-2008, 08:52

- [WPF] Comment charger dynamiquement un fichier XAML qui définit des eventhandler ? par Thomas Lebrun le 09-04-2008, 10:56

- Article sur le filtrage des modèles de site SharePoint par The Grib's Lair [Sébastien PICAMELOT - MVP SharePoint] le 09-04-2008, 00:11