【问题标题】:Captured Variables... What does that 'Captured' stands for actually?捕获的变量...“捕获”实际上代表什么?
【发布时间】:2012-10-19 05:48:09
【问题描述】:

在“捕获的变量”中如何捕获变量?

“捕获”一词实际上代表什么?

这是否意味着在不涉及装箱的情况下引用值类型?

谢谢

【问题讨论】:

    标签: c# .net casting captured-variable


    【解决方案1】:

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

    考虑以下

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

    在上面的例子中,字符串变量 s 被内联动作 a 捕获。

    在底层,C# 编译器将创建一个内部类,其中 Action a 引用以捕获变量 s 的值。需要注意的是,字符串 s 是通过引用动作 a 传递的,所以动作实际上会打印出“hello2”,而不是“hello”。如果没有清楚地理解,这可能会产生意想不到的副作用,并且被称为“访问修改后的闭包”。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多