当在c#中的闭包中使用其字段时,闭包捕获的对象是

时间:2013-01-26 16:24:49

标签: c# garbage-collection closures

如果一个匿名方法捕获一个对象的字段,那么整个对象是否会被限制并且不会被收藏?

所以下面是一个片段,我想知道的是,只要没有从列表中删除匿名方法,SessionKeeper是否会保留对象f:

class Foo
{
    public String State { get; set; }
    public void KeepState()
    {
        SessionKeeper.Singleton.Add(delegate
        {
            //do something with this.State
        });
    }
}

Foo f = new Foo();
f.KeepState();

1 个答案:

答案 0 :(得分:8)

  

如果一个匿名方法捕获一个对象的字段,那么整个对象是否会被限制并且不会被收藏?

这个问题预示着虚假,因此无法明智地回答。匿名方法只“捕获”本地,形式参数和this,永远不会是类的字段。为了结束,类的字段,数组的元素等不被视为“外部变量”。

现在,如果该字段是本地的字段,那么您已使用本地,并且将捕获本地。但无论你是否将它用于其田地,它都会被捕获;这些领域没有进入。