2017-08-01 52 views
0

如果我将以下代码看作Javascript代码,那么它会有意义......但是,它如何在Main中的call action()不为我产生一个NullReferenceException? Action是否抓取了像JavaScript一样的东西?感谢所有人。C#中是否存在“Javascript上下文”这样的事情?

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

} 

OUTPUT >> 7

+1

您正在寻找的词是'闭包',而不是上下文。如果您搜索“C#closure”,那么关于该主题的信息有相当多的信息,但实质上,'i'从'method'中提取到其闭包中,这允许它在离开“method”的范围后保留。 – Rob

回答

0

method建立的lambda捕捉拉姆达内引用的任何变量。

看到这篇文章:https://blogs.msdn.microsoft.com/matt/2008/03/01/understanding-variable-capturing-in-c/

+0

如果在链接变量'name'的文章中是一个原始类型,Capture类将获得一个副本,并且调用方法中的任何更改都不会反映在Capture类中。但他们是?我知道,Capture类只是一个我认为是针对参考类型的想法。 – Doug

+0

不正确 - 所有以前是本地的引用现在都引用Capture类的字段。变量/字段的类型无关紧要。 – NetMage

+0

但是,当我们在主方法中更改'名称'时,捕获的领域发生了变化......这发生在Capture类用它自己的那个变量副本创建之后? – Doug

相关问题