静的インスタンス、デスクラクターが呼び出されていない
-
22-08-2019 - |
質問
以下のコードを参照してください。デストラクターは決して呼び出されません。これがなぜ、そしてどのように修正できるのか知っている人はいますか?
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()
{
}
}
解決
あなたはクリア(
null
に設定)しない限り、静的フィールドで参照されるオブジェクトは単純に確定されていないフィールド - とさえ、それは非決定論的であり、保証しません。静的フィールドは、ルートオブジェクトとして数えます。
場合には(そしてなぜ)あなたは、これが完成/収集されることを期待するでしょうか?それはまだアクセス可能です...
他のヒント
静的フィールドによって参照されるオブジェクトは常に(なしクラスアンロードまたは任意の他のGC funkinessを想定していない)に到達可能であり、収集されません。
プロセスのシャットダウン時に静的オブジェクトのファイナライザーが実行されることが期待される場合でも、その保証はありません。
- http://blogs.msdn.com/cbrumme/archive/2004/02/20/77460.aspx (「V1 および V1.1 ファイナライズ保証」というタイトルのセクションを参照してください)。.NET 2.0 以降でこれがどの程度変更されたかはわかりません。
これはデストラクタはありません。それはファイナライザです。それは別のことです。他の2つは、これは静的なので、それが収集されることはありません、と述べてきたように、それゆえ、ファイナライザが実行されることはありません。
所属していません StackOverflow