2009-10-28 5 views
7

En cherchant la réponse à cette question: "Why is an out parameter not allowed within an anonymous method?" Je me suis un peu perdu sur la façon dont l'expression lambda et les méthodes anonymes fonctionnent réellement. Dans les commentaires, JaredPar déclare: «Imaginez par exemple que le paramètre out se réfère à une variable locale de la pile: le lambda peut s'exécuter à n'importe quel point dans le futur et pourrait donc s'exécuter lorsque cette pile ne serait plus valide ".Comment les expressions lambda fonctionnent-elles en interne?

J'ai fait remarquer que ce ne serait pas le cas avec d'autres variables ... ce qui me fait essentiellement me demander ce que je sais vraiment sur les expressions lambda.

La chose que j'ai à l'esprit est quelque chose comme ceci:

public void Foo(ComplexObject val, out SomeDelegate outDelegate) 
{ 
    ComplexObject obj = new ComplexObject(val) 
    SomeDelegate = delegate(int other) { return (obj.value * other); } 
} 

public void Bar() 
{ 
    SomeDelegate MyDel = null; 
    Foo(5, out MyDel); 
    int finalRes = MyDel(100); 
    // Whatever 
} 

Dans cette situation, je ne sais pas vraiment ce qui se passe. obj est une référence sur la pile qui ne serait plus valide sur le retour de la méthode, donc la méthode de l'annonceur devrait être capable (si ça marche) de savoir que c'est un type de référence et de copier la référence au lieu de la valeur pourquoi les params ref ne fonctionneraient-ils pas si le "use case" est plus ou moins le même?

Répondre

6

Jon Skeet a écrit un in-depth description.

Fondamentalement, le compilateur transforme la méthode externe en une classe et transforme toutes les variables auxquelles les méthodes anonymes accèdent en champs de la classe. Les méthodes anonymes deviennent des méthodes d'instance régulières sur la classe.