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 に答える