2017-08-01 1 views
0

Si je regardais le code suivant code Javascript, il serait logique ... mais comment est-ce que l'action d'appel() Main ne renvoie une exception NullReferenceException pour i? L'Action a-t-elle saisi un contexte JavaScript comme une chose? Merci d'avance à tous.Y at-il une telle chose comme un « contexte Javascript » en C#

public class Program 
{ 
    static void Main(string[] args) 
    { 
     var p = new Program(); 
     var action = p.method(); 
     action(); 
     Console.ReadKey(); 

    } 

    public Action method() 
    { 
     var i = 6; 
     Action action =() => Console.WriteLine(i); 
     i++; 
     return action; 
    } 

} 

SORTIE >> 7

+1

Le mot que vous cherchez est « fermeture », plutôt que dans un contexte. Il y a un peu d'informations sur le sujet si vous recherchez « C# fermeture », mais en substance, 'I' est extrait de' method' dans sa fermeture, ce qui lui permet de persister après avoir quitté le champ de 'method'. – Rob

Répondre

0

Le lambda créé en method capture toutes les variables référencées dans le lambda.

Voir cet article: https://blogs.msdn.microsoft.com/matt/2008/03/01/understanding-variable-capturing-in-c/

+0

si, dans l'article que vous liez le « nom » étaient variables d'un type primitif, la classe de capture obtiendrait une copie et toute modification de la méthode d'appel ne seraient pas reflétés dans la classe de capture. Pourtant ils sont? Je sais que la classe Capture était simplement une idée que je supposais adaptée aux types de référence. – Doug

+0

Non vrai - toutes les références à ce qui était auparavant un local sont maintenant des références au champ de la classe Capture. Le type de la variable/champ n'a pas d'importance. – NetMage

+0

Mais le domaine de la capture change quand on change le « nom » dans la principale méthode ... et cela se produit après la classe de capture a été créé avec sa propre copie de cette variable? – Doug