5
A
回答
7
捕獲變量通常是指具有封閉件(基本上是一個內聯函數)捕獲的變量。 「捕獲」意味着內聯函數必須「捕獲」外函數中的變量的引用。爲此,C#編譯器生成一個內部類,並通過引用將外部變量傳遞給內部類(內聯函數隨後引用它)。如果你反彙編你的代碼,你可以看到這個。
考慮以下
void Main()
{
string s = "hello";
Action a = delegate
{
Debug.WriteLine(s);
};
s = "hello2";
a();
}
在上面的例子中,字符串變量s被內聯動作的拍攝。
在引擎蓋下,C#編譯器將創建一個內部類,該Action引用捕獲變量s的值。需要注意的是,字符串s是通過引用傳遞給Action a的,因此該操作實際上會打印出「hello2」,而不是「hello」。這可能會產生意想不到的副作用,如果不能清楚地理解,並且被稱爲「訪問修改後的封閉」。
相關問題
- 1. 爲什麼C#試圖捕獲實際捕獲錯誤?
- 2. 爲什麼會捕獲所有的塊實際上並沒有捕獲所有
- 3. 什麼是塊變量捕獲?
- 4. Lambda變量捕獲
- 5. 捕獲的變量實例化問題
- 6. 捕獲日期的實際數值
- 7. 捕獲多個變量
- 8. lua - 捕獲變量賦值
- 9. 如何捕獲變量(C#)
- 10. node.js捕獲閉包變量
- 11. Perl錯誤捕獲變量
- 12. Lambda Metafactory變量捕獲
- 13. 捕獲成員變量值
- 14. Lambda表達式和變量捕獲
- 15. 什麼進入()捕獲?
- 16. 從lambda捕獲捕獲變量會出錯?
- 17. 爲什麼非捕獲的變量會引發警告?
- 18. 爲什麼捕獲的變量沒有持有對象實例的引用
- 19. 捕獲和非捕獲模式有什麼區別?
- 20. 爲什麼捕獲說明符在捕獲列表中是可選的?
- 21. 爲什麼沒有局部變量捕獲? C#閉合bahavior
- 22. 爲什麼libncurses ui在捕獲到Bash變量時不顯示?
- 23. 爲什麼不能將Gremlin GraphTraversal捕獲爲Groovy變量?
- 24. Javascript可變捕獲
- 25. 在lambda表達式中指定捕獲的變量的目的是什麼?
- 26. Sqlmap流量捕獲
- 27. VBScript捕獲錯誤的變量值
- 28. 捕獲文件中的Dockerfile變量
- 29. Java中的捕獲塊變量警告
- 30. 捕獲SSH對變量的響應
這值得一看: http://blogs.msdn.com/b/matt/archive/2008/03/01/understanding-variable-capturing-in-c.aspx – pencilCake