在“捕获的变量”中如何捕获变量?
'捕获'一词实际上代表什么?
这是否意味着在不涉及拳击的情况下引用值类型?
由于
答案 0 :(得分:7)
捕获变量通常是指用闭包捕获的变量(基本上是内联函数)。 “捕获”意味着内联函数必须“捕获”对外部函数中变量的引用。为此,C#编译器生成一个内部类,并通过引用将外部变量传递给内部类(内联函数随后引用)。如果您反汇编代码,可以看到这一点。
考虑以下
void Main()
{
string s = "hello";
Action a = delegate
{
Debug.WriteLine(s);
};
s = "hello2";
a();
}
在上面的示例中,字符串变量s由内联Action a。
捕获在引擎盖下,C#编译器将创建一个内部类,Action引用它来捕获变量s的值。重要的是要注意字符串s是通过引用Action a传递的,因此该操作实际上会打印出“hello2”,而不是“hello”。如果不清楚,这可能会产生意想不到的副作用,并被称为“访问修改后的闭包”。