2009-03-31 19 views
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() 
    { 

    } 
} 

答えて

8

あなたはクリア(nullに設定)しない限り、静的フィールドで参照されるオブジェクトは単純に確定されていないフィールド - とさえ、それは非決定論的であり、保証しません。静的フィールドはルートオブジェクトとしてカウントされます。

これが収集/確定されると予想されるのはなぜですか?それはまだアクセス可能です...

2

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

1

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

+0

なぜdtor/finalizerが異なるのですか? C#のdtorはFinalizeにマッピングされます。 –

+0

デストラクタとファイナライザ - どちらの用語も、公式文書では互換的に使用されています。使用された言葉は行動に影響しません... –

+0

@Marc:私はそれをデストラクタと呼んだことはありません。あなたはそうするリンクで返答することができますか? –

2

あなたは、プロセスがシャットダウンされたときに実行する静的オブジェクトのファイナライザを期待するかもしれないにもかかわらず、そこ保証はないのいずれか:

関連する問題