82

私はガベージコレクターがC#でどのように機能するかを研究しています。Destructor、メソッドの使用について混乱していますDisposeFinalize

私の調査と理解によると、クラス内にDestructorメソッドがあると、クラスのインスタンスで明示的に呼び出すことができないdestructorメソッドで説明されている方法でガベージコレクションを実行するようにガベージコレクターに指示されます。

このDisposeメソッドは、ガベージコレクションを制御するためのユーザーを提供することを目的としています。このFinalizeメソッドは、クラスによって使用されているリソースを解放しますが、オブジェクト自体は解放しません。

私はそれを正しい方法で理解しているかどうかわかりません。疑問を明確にしてください。それ以上のリンクやガイドは大歓迎です。

4

2 に答える 2

73

デストラクタは暗黙的にFinalizeメソッドを呼び出しますが、技術的には同じです。Disposeは、IDisposableインターフェイスを実装するオブジェクトで使用できます。

あなたが見るかもしれません:デストラクタC#-MSDN

デストラクタは、オブジェクトの基本クラスでFinalizeを暗黙的に呼び出します。

同じリンクからの例:

class Car
{
    ~Car()  // destructor
    {
        // cleanup statements...
    }
}

デストラクタのコードは、暗黙的に次のコードに変換されます。

protected override void Finalize()
{
    try
    {
        // Cleanup statements...
    }
    finally
    {
        base.Finalize();
    }
}

デストラクタに対するあなたの理解は正しいです:

MSDNから

これはガベージコレクタによって決定されるため、プログラマはデストラクタがいつ呼び出されるかを制御できません。ガベージコレクタは、アプリケーションで使用されなくなったオブジェクトをチェックします。オブジェクトが破棄の対象であると見なされる場合、デストラクタ(存在する場合)を呼び出し、オブジェクトの格納に使用されたメモリを再利用します。プログラムの終了時にもデストラクタが呼び出されます。Collectを呼び出すことでガベージコレクションを強制することは可能ですが、パフォーマンスの問題が発生する可能性があるため、ほとんどの場合、これは回避する必要があります。

于 2012-12-21T10:27:01.697 に答える
57

C#の用語では、デストラクタとファイナライザは基本的に交換可能な概念であり、外部ハンドルなどのタイプが収集されるときにアンマネージリソースを解放するために使用する必要があります。ファイナライザーを作成する必要があることは非常にまれです。

それに関する問題は、GCが非決定論的であるということです。そのため、Dispose()(を介した)メソッドは決定論的クリーンアップIDisposableをサポートすることを可能にします。これはガベージコレクションとは関係がなく、呼び出し元がリソースをより早く解放できるようにします。また、(アンマネージドに加えて)マネージドリソースでの使用にも適しています。たとえば、データベース接続をカプセル化するタイプがある場合は、タイプを破棄して接続を解放することもできます。

于 2012-12-21T10:31:18.060 に答える