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

Rus*_*Yan 1 c# closures garbage-collection

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

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

Eri*_*ert 8

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

这个问题预示着虚假,因此无法得到明智的回答.匿名方法只能"捕获"本地,形式参数this,而不是类的字段.为了结束,类的字段,数组的元素等不被视为"外部变量".

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