2

以下のコードを参照してください。デストラクタは呼び出されません。これを修正できる理由と方法を知っている人はいますか?

public partial class Form1 : Form
{
    private Goo goo;

    public Form1()
    {
        InitializeComponent();

        goo = Goo.GetInstance();         
    }
}

public class Goo
{
    private foo f = new foo();
    private static Goo goo;
    private Goo()
    {}

    public static Goo GetInstance()
    {
        if(goo!=null)
        {
            goo = new Goo();
        }
        return goo;
    }

    ~Goo()
    {

    }
}

class foo
{
    ~foo()
    {

    }
}
4

4 に答える 4

8

静的フィールドによって参照されるオブジェクトはnull、フィールドをクリア (に設定) しない限り、単純にファイナライズされません。静的フィールドはルート オブジェクトとしてカウントされます。

これがいつ(そしてなぜ)収集/確定されると思いますか? 今でもアクセス可能...

于 2009-03-31T22:17:50.857 に答える
2

プロセスがシャットダウンされたときに静的オブジェクトのファイナライザーが実行されることを期待している場合でも、次のような保証はありません。

于 2009-03-31T22:28:21.363 に答える
2

静的フィールドによって参照されるオブジェクトは常に到達可能であり (クラスのアンロードやその他の GC 機能がないと仮定して)、収集されることはありません。

于 2009-03-31T22:17:51.433 に答える
1

それはデストラクタではありません。ファイナライザーです。それは別のことです。他の2つが言ったように、これは静的であるため、収集されることはなく、ファイナライザーが実行されることはありません。

于 2009-03-31T22:23:10.407 に答える