Finalize メソッドおよびデストラクター

アプリケーションで作成されるオブジェクトの大部分については、.NET Framework のガベージ コレクターによって、必要なすべてのメモリ管理タスクを暗黙的に実行できます。 しかし、アンマネージ リソースをカプセル化したオブジェクトを作成する場合は、アプリケーションでそのオブジェクトの使用が終了した時点で、アンマネージ リソースを明示的に解放する必要があります。 アンマネージ リソースの最も一般的な種類は、ファイル、ウィンドウ、ネットワーク接続などのオペレーティング システム リソースをラップしたオブジェクトです。 ガベージ コレクターは、アンマネージ リソースをカプセル化したオブジェクトを有効期間全体にわたって監視できますが、そのリソースをクリーンアップする方法については具体的な情報を持っていません。 このような種類のオブジェクトのために、.NET Framework には Object.Finalize メソッドが用意されています。このメソッドを使用すると、オブジェクトで使用するメモリをガベージ コレクターが再利用するときに、使用するオブジェクトが自身のアンマネージ リソースを正しくクリーンアップできるようになります。 既定では、Finalize メソッドは何も実行しません。 ガベージ コレクターが、オブジェクトのメモリを再利用する前にオブジェクトをクリーンアップするようにするには、クラス内で Finalize メソッドをオーバーライドする必要があります。

注意

C# で Finalize メソッドを実装するには、デストラクター構文を使用する必要があります。.NET Framework Version 2.0 の Visual C++ には Finalize メソッドを実装するための独自の構文が用意されています。詳細については、「方法: クラスと構造体をインスタンス化する」を参照してください。.NET Framework Version 1.0 および 1.1 では Visual C++ でも、C# と同じように、Finalize メソッドに対してデストラクター構文が使用されていました。

ガベージ コレクターは、終了キューと呼ばれる内部構造を使って、Finalize メソッドを持つオブジェクトを監視します。 アプリケーションで Finalize メソッドを持つオブジェクトが作成されるたびに、ガベージ コレクターは、そのオブジェクトを指すエントリを終了キューに置きます。 終了キューには、ガベージ コレクターによって再利用される前にその終了コードが呼び出される必要のある、マネージ ヒープ内のすべてのオブジェクトのエントリが格納されています。

注意

GC.KeepAlive メソッドのコード例では、再利用するオブジェクトのメンバーがまだ実行中の場合でも、ガベージ コレクションがファイナライザーを実行しようとします。これを避けるために KeepAlive メソッドを使用する方法を紹介します。

Finalize メソッドからは例外をスローしません。アプリケーションは例外を処理できないので、それが原因で異常終了する可能性があります。

Finalize メソッドまたはデストラクターを実装するとパフォーマンスが低下する場合があります。したがって、このメソッドまたはデストラクターは必要なときだけ使用してください。 Finalize メソッドを持つオブジェクトが使用していたメモリを再利用するには、少なくとも 2 回のガベージ コレクションが必要です。 ガベージ コレクターは、コレクションの実行時に、終了処理を持たないアクセスできないオブジェクトのメモリを再利用します。 この時点では、終了処理を持つアクセスできないオブジェクトにはコレクションを実行できません。 代わりに、これらのオブジェクトのエントリを終了キューから削除し、終了準備完了のマークを付けられたオブジェクトのリストに登録します。 このリストのエントリは、終了コードを呼び出す準備ができているマネージ ヒープ内のオブジェクトを指します。 ガベージ コレクターはこのリスト内のオブジェクトの Finalize メソッドを呼び出し、オブジェクトのエントリをリストから削除します。 2 回目のガベージ コレクションは、終了したオブジェクトを指すエントリが、終了準備完了のマークを付けられたオブジェクトのリストに含まれていないので、これらのオブジェクトが本当に不要であると判断します。 この 2 回目のガベージ コレクションで、オブジェクトのメモリが実際に再利用されます。

参照

関連項目

Finalize

概念

Finalize メソッドのオーバーライド

C# および C++ のデストラクター構文