内部匿名方法中变量的范围

Sub*_*cob 2 c# oop closures

看代码

public class Test
{
    public static void Main()
    {
        Test t = new Test();
        var AnonymousMethod = t.OuterMethod();
        AnonymousMethod("passedValue");
    }
     public delegate void SampleDelegate(string InputText);

     public SampleDelegate OuterMethod()
    {
        string outerValue="outerValue";
        return (x => {
            Console.WriteLine(x);
            Console.WriteLine(outerValue);
        });

    }
}
Run Code Online (Sandbox Code Playgroud)

产量

Success  time: 0.02 memory: 33816 signal:0
passedValue
outerValue
Run Code Online (Sandbox Code Playgroud)

链接到示例

通常,变量的范围outerValue将在调用后结束t.OuterMethod().但是在使用匿名类型的情况下,Console清楚地输出了输出(Console.WriteLine(outerValue)),这意味着变量的范围没有结束.编译器实际上做了什么来确定其范围?它会将Main方法范围分配给匿名方法中使用的变量吗?我知道如何使用,但不知道它是如何工作的.请指导我?

编辑

假设附加到事件的匿名方法.该事件可能会在以后执行很多次.然后变量将在内存中.仪式?如果分配了很多事件,很多内存!我想这是件坏事.我犯了什么错吗?

Jon*_*eet 5

变量的范围(程序文本的区域可以在没有限定条件的情况下引用它)保持不变.

变量的"生命周期"有效地扩展:lambda表达式捕获变量.编译器将为您生成一个私有嵌套类,其中包含该变量 - 方法和委托都引用此嵌套类的相同实例,并且该方法不再适用于垃圾收集,直到该方法不再引用它和委托实例有资格进行垃圾回收.