2017-08-01 86 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

相關問題