1. ホーム
  2. c#

[解決済み] デストラクタ、ディスポーザ、ファイナライズメソッドの違い

2023-07-28 19:40:35

質問

c#でガベージコレクタがどのように動作するか勉強しています。の使い方で迷っています。 Destructor , DisposeFinalize メソッドを使用します。

私の調査と理解では、クラス内にデストラクタメソッドを持つことは、ガベージコレクタに、クラスのインスタンス上で明示的に呼び出すことができないデストラクタメソッドで述べられた方法でガベージコレクションを実行するよう指示します。

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

私は正しい方法で理解しているかどうかわかりません。疑問を明らかにしてください。さらなるリンクやガイドがあれば歓迎します。

どのように解決するのですか?

Destructorは暗黙のうちにFinalizeメソッドを呼び出しており、技術的には同じものです。DisposeはIDisposableインターフェイスを実装したオブジェクトで利用可能です。

あなたは、: デストラクタ C# - MSDN

<ブロッククオート

デストラクタは、暗黙のうちにオブジェクトの基底クラスに対してFinalizeを呼び出します。 オブジェクトを呼び出します。

同じリンクからの例です。

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

Destructorのコードは暗黙のうちに以下のコードに変換されています。

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

Destructorに対する理解は正しいです。

から MSDN

<ブロッククオート

この プログラマはデストラクタがいつ呼ばれるかを制御することができません。 これはガベージコレクタによって決定されるからです。 . ガベージコレクタは ガベージコレクタは、アプリケーションによって使われなくなったオブジェクトをチェックします。 アプリケーションによって使用されなくなったオブジェクトをチェックします。もし、オブジェクトが破棄される資格があると判断した場合、ガベージコレクタは デストラクタを呼び出し、そのオブジェクトを保存するために使用されたメモリを回収します。 を回収します。デストラクタは、プログラムが終了するときにも呼び出されます。また Collectを呼び出すことで強制的にガベージコレクションを行うことも可能ですが、ほとんどの場合、これは避けるべきです。 を呼び出すことで強制的にガベージコレクションを行うことができますが、ほとんどの場合、これは性能上の問題を引き起こす可能性があるため、避ける必要があります。 を呼び出すことで強制的にガベージコレクションを行うことができます。