1

如果一个匿名方法捕获了一个对象的一个​​字段,整个对象会被捕获而不是被垃圾收集吗?

所以下面是一个片段,我想知道的是,只要匿名方法没有从列表中显式删除,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();
4

1 回答 1

8

如果一个匿名方法捕获了一个对象的一个​​字段,整个对象会被捕获而不是被垃圾收集吗?

这个问题以虚假为前提,因此无法明智地回答。匿名方法仅“捕获”局部变量、形式参数和this,从不捕获类的字段。类的字段、数组的元素等等,为了结束的目的,不被认为是“外部变量”。

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

于 2013-01-26T16:27:13.140 回答