1

C# を使用します。

私は MainFoo クラスを持っています:

class MainFoo
{
    private Foo foo;

    public MainFoo()
    {
        this.foo = new Foo();
    }  

    public CreateNewFoo()
    {
        this.foo = new Foo();
    }

    public DoCurrentFoo()
    {
        this.foo.Do();
    }
}

Foo クラス:

class Foo
{
    ~Foo()
    {
        this.DoEnd();
    }

    public void Do() {}

    private void DoEnd() {}
}

get が再度初期化されるたびにDoEnd() 、Fooクラスのメソッドを呼び出せるようにしたいと考えています。private Foo;このメソッドDoEnd()は非公開であり、そのままにしておきたい(そのため からはアクセスできないMainFoo)

同じ Foo get が再び初期化されるため、インスタンスはその参照を失い、デストラクタを呼び出すと思います。ただし、これはインスタンスが参照を失った場合にのみ呼び出されMainFooます。

質問: 参照を失ったときにオブジェクト インスタンスを破棄する方法を教えてください。

4

2 に答える 2

6

デストラクタは、特定の時間に呼び出されることは保証されておらず、まったく呼び出されることさえありません。通常、デストラクタに依存するべきではなく、IDisposable を実装して自分で Dispose を呼び出す必要があります。

最も便利なことに、これは で実行できますusing(...){ }

サンプルに戻ると、プロパティの割り当て時にオブジェクトを破棄することもできますが (Jason Watkins が提案したように)、他の場所で使用されていないことを確認してください。

public Foo F
{
    get{return foo;}
    set
    {
        if( foo != null)
            foo.Dispose();
        foo = value;
     }
}
于 2013-04-01T16:33:11.900 に答える
0

できません。ガベージ コレクターの仕事です。

MSDNから:

C# では、ガベージ コレクションは、JVM と同様の機能を持つ共通言語ランタイム (CLR) によって処理されます。CLR ガベージ コレクターは、参照されていないオブジェクトがないかメモリ ヒープを定期的にチェックし、これらのオブジェクトが保持しているリソースを解放します。

于 2013-04-01T16:32:36.070 に答える