2012-02-01 3 views
0

Y at-il des différences dans les références qui sont produites dans le code généré pour les méthodes anonymes par un compilateur .NET 2.0 ou 4.0 et le code généré pour un lambda équivalent par un compilateur .NET 4.0? et en particulier pour ce pointeur: Je sais que les méthodes anonymes et lambdas sont une fonctionnalité du compilateur C# et le compilateur génère en fait une classe imbriquée avec un délégué et toutes les références requises pour les variables externes, mais this article indique l'implémentation des méthodes anonymes. la référence est gardée au pointeur et je ne trouve pas de source décrivant quoi que ce soit de similaire pour lambdas .. ou est-ce que je ne trouve rien car l'implémentation pour compiler des méthodes anonymes mappe 1 sur 1 à celle de lambdas?références gardées par des méthodes anonymes et lambdas

est ici un peu de code pour démontrer les méthodes et les lambdas anonymes:

class AnonymousMethodMethodScope 
    { 
     private Func<bool> d; 
     public Func<int, bool> d2; 
     int j = 0; 

     public void Test(int i) 
     { 
      d = new Func<bool>(delegate { j = 10; return j > i; }); 

      // what references does this anonymous method keep? 
      d2 = new Func<int, bool>(delegate(int x) { return x == j; }); 

      Console.WriteLine("j = " + j + " result = " + d()); 
     } 
    } 

    class LambdaMethodScope 
    { 
     private Func<bool> d; 
     public Func<int, bool> d2; 

     public void Test(int i) 
     { 
      int j = 0; 

      d =() => { j = 10; return j > i; }; 

      // what references does this lambda keep? 
      d2 = x => x == j; 

      Console.WriteLine("j = " + j + " result = " + d()); 
     } 
    } 

Répondre

2

Oui, les expressions lambda va faire (et doivent faire) la même chose que des méthodes anonymes en ce qui concerne les variables de capture. (Je suppose que vous parlez d'expressions lambda qui sont converties en délégués, si elles sont converties en arbres d'expression, elles peuvent être un peu différentes - je ne suis pas sûr.)

+0

Je suis désolée d'avoir apporté cette encore une fois mais .. pourquoi ?? pourquoi le pointeur est-il également capturé pour la variable 'j' dans l'exemple ci-dessus qui a la portée de la méthode? et que se passerait-il si la variable 'j' était statique, donc elle avait une portée de type au lieu de portée de classe ?? Je n'ai pas encore voté pour cette réponse parce que je suis toujours aux prises avec ces questions. – mtijn

+1

@mtijn: Dans votre exemple 'LambdaMethodScope' (qui n'était pas présent lorsque j'ai écrit cette réponse) il * n'a pas besoin de capturer' this', car 'j' est une variable locale. Dans votre exemple 'AnonymousMethodMethodScope' c'est une variable * instance *, donc la méthode anonyme doit capturer' this' afin de mettre 'this.j' plus tard. Si vous faites une comparaison entre deux façons de faire quelque chose, vous devez vous assurer que vous faites la même chose dans les deux exemples! Si 'j' était statique, il n'aurait pas besoin de capturer quoi que ce soit. –

+1

@mtijn: Notez qu'une fonction anonyme qui * seulement * doit capturer 'this' peut simplement utiliser une méthode d'instance créée dans le même type. Cela fonctionnerait pour votre deuxième exemple de méthode anonyme - mais pas pour le premier, qui * doit * aussi * capturer une variable locale (le paramètre). –

Questions connexes