看代码
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方法范围分配给匿名方法中使用的变量吗?我知道如何使用,但不知道它是如何工作的.请指导我?
编辑
假设附加到事件的匿名方法.该事件可能会在以后执行很多次.然后变量将在内存中.仪式?如果分配了很多事件,很多内存!我想这是件坏事.我犯了什么错吗?
变量的范围(程序文本的区域可以在没有限定条件的情况下引用它)保持不变.
变量的"生命周期"有效地扩展:lambda表达式捕获变量.编译器将为您生成一个私有嵌套类,其中包含该变量 - 方法和委托都引用此嵌套类的相同实例,并且该方法不再适用于垃圾收集,直到该方法不再引用它和委托实例有资格进行垃圾回收.