2009-07-31 171 views
3
var foo = "bar"; 

new Func<String>(() => 
{ 
    var foo = ""; // This can't be done in C#. Why is that? 

    /* In JavaScript, this is perfectly valid, since this scope (the anonymous 
     function) is disconnected from the outer scope, and any variable declared 
     within this scope will not affect variables in the outer scope */ 

})() 

回答

13

其實,即使在javascript中,它也不會完全斷開; javascript允許使用詞法關閉 - 因此如果沒有varfoo的舊值應仍可用。

區別在於javascript 選擇以允許您用不同的含義重新聲明該名稱(在內部範圍內)。 C#不選擇

我覺得C#版本不太容易混淆!特別是當代碼(在方法中更深入)期望討論「舊」變量時,突然開始查看「新」變量。

4

C#捕獲匿名函數中的局部變量。這實際上是JavaScript也支持的一個非常強大的功能,但方式稍有不同。

這個概念是計算機科學家稱之爲closure。通過捕獲局部變量,它們可以成爲函數本身狀態的一部分,從而爲您提供更多的靈活性。

0

由於代碼將兩個符號都引用爲「本地」,編譯器無法簡單地通過上移作用域鏈(本地 - >成員 - >類型)來發現您指的是哪個。如果您有任何疑問或建議,請聯繫我們,我們會盡快與您聯繫。