捕获的变量......"捕获"实际代表什么?

pen*_*ake 5 .net c# casting captured-variable

在"捕获的变量"中如何捕获变量?

"捕获"一词究竟代表什么?

这是否意味着引用值类型而不涉及拳击?

谢谢

Jef*_*eff 7

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

考虑以下

void Main()
{
     string s = "hello";
     Action a = delegate 
     { 
          Debug.WriteLine(s);
     };
     s = "hello2";
     a();
} 
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,字符串变量s由内联Action a捕获.

在引擎盖下,C#编译器将创建一个内部类,Action引用它来捕获变量s的值.重要的是要注意字符串s是通过引用Action a传递的,因此该操作实际上会打印出"hello2",而不是"hello".如果不清楚地理解,这可能产生意想不到的副作用,并且被称为"访问修改的闭合".