【发布时间】:2013-12-29 08:12:14
【问题描述】:
查看代码
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);
});
}
}
输出
Success time: 0.02 memory: 33816 signal:0
passedValue
outerValue
链接到Example
通常变量outerValue 的范围会在调用t.OuterMethod() 之后结束。但是在使用匿名类型的情况下,控制台清楚地打印了输出(Console.WriteLine(outerValue)),这意味着变量的范围没有结束。编译器实际上做了什么来确定它的范围?它会将Main 方法的范围分配给匿名方法中使用的变量吗?我知道如何使用,但不知道它是如何工作的。请指导我?
编辑
假设附加到事件的匿名方法。该事件可能是 稍后执行。然后变量将在内存中。仪式?如果 分配了很多事件,大量内存!我想这是一件坏事。 我有没有搞错?
【问题讨论】:
-
变量被编译成一个闭包,供匿名方法使用和保存。
-
@AdamHouldsworth 那么关闭的范围?
-
查看 Jon Skeet 的回答 :-)