捕获变量...实际上,“捕获”代表什么意思?

5
在"捕获变量"中,变量是如何被捕获的?
实际上,“捕获”一词代表什么意思?
这是否意味着在不涉及装箱的情况下引用值类型?
谢谢
1个回答

7

捕获变量通常指使用闭包(基本上是一个内联函数)捕获的变量。 "捕获" 意味着内联函数必须在外部函数中“捕获”对变量的引用。为此,C#编译器会生成一个内部类,并将外部变量按引用传递到内部类中(随后内联函数引用该变量)。如果您反汇编代码,您可以看到这一点。

考虑以下内容

void Main()
{
     string s = "hello";
     Action a = delegate 
     { 
          Debug.WriteLine(s);
     };
     s = "hello2";
     a();
} 

在上面的示例中,字符串变量s被内联Action a捕获。
在幕后,C#编译器将创建一个内部类,Action a引用该类以捕获变量s的值。重要的是要注意,字符串s按引用传递给Action a,因此该操作实际上会打印出"hello2",而不是"hello"。如果没有清楚地理解这一点,可能会产生意外的副作用,这被称为“访问已修改闭包”。

这也值得一看: http://blogs.msdn.com/b/matt/archive/2008/03/01/understanding-variable-capturing-in-c.aspx - pencilCake

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接