Object.Finalize メソッド

Object がガベージ コレクションにより収集される前に、その Object がリソースを解放し、その他のクリーンアップ操作を実行できるようにします。

[C#] C# では、ファイナライザはデストラクタ構文で表現されます。

[C++] C++ では、ファイナライザはデストラクタ構文で表現されます。

Overrides Protected Sub Finalize()
[C#]
~Object();
[C++]
~Object();
[JScript]
protected override function Finalize();

解説

Finalize は保護されているため、このクラスまたは派生クラスを使用したときだけアクセスできす。

SuppressFinalize 呼び出しによる終了操作の対象であるオブジェクトにアクセスできなくなった場合に、このメソッドが自動的に呼び出されます。アプリケーション ドメインのシャットダウン中に、終了処理の対象であるオブジェクトに対して Finalize が自動的に呼び出されます。このメソッドは、これらのオブジェクスがアクセス可能な場合でも呼び出されます。オブジェクトが ReRegisterForFinalize などの機構を使用して再登録され、 GC.SuppressFinalize が呼び出されている場合を除き、Finalize は特定のインスタンスに対して自動的に 1 回だけ呼び出されます。

派生型での Finalize 実装は、その基本型の Finalize 実装を呼び出す必要があります。この条件を満たしている場合にだけ、アプリケーション コードで Finalize を呼び出すことができます。

Finalize 操作に関する制約事項を次に示します。

  • ガベージ コレクション実行中のファイナライザの実行時期は未定義です。Close メソッドまたは Dispose メソッドを呼び出さない限り、特定の時点でリソースが解放されることは保証されません。
  • 2 つのオブジェクトのファイナライザが特定の順序で実行されることは保証されません。これは、1 つのオブジェクトがもう 1 つのオブジェクトを参照している場合にも同様です。つまり、オブジェクト A がオブジェクト B を参照しており、どちらのオブジェクトにもファイナライザがある場合、オブジェクト A のファイナライザが開始した時点でオブジェクト B が既に終了していることがあります。
  • ファイナライザの実行スレッドは指定されません。

次に示す状況では、 Finalize メソッドが完了しないことや、このメソッドがまったく実行されないことがあります。

  • 別のファイナライザが無期限にブロックしている。たとえば、無限にループしているか、取得不可能なロックを取得しようとしている場合など。ランタイムが完了処理のためにファイナライザを実行しようとしているため、ファイナライザが無期限にブロックしている場合には、他のファイナライザが呼び出されません。
  • ランタイムがクリーンアップを実行する前に、プロセスが終了した。この場合、プロセス終了をランタイムへ伝える最初の通知は DLL_PROCESS_DETACH 通知です。

シャットダウン中にはランタイムがオブジェクトの Finalize を続行しますが、終了できるオブジェクトの数は減少し続けます。

ランタイムは、 Finalize または Finalize のオーバーライドによりスローされた例外を無視します。ランタイムはその Finalize メソッドを終了し、終了処理を続行します。

実装時の注意:

既定では Object.Finalize は何も実行しません。 Finalize を実行する必要がある場合には、ガベージ コレクションによるメモリ収集に時間がかかる傾向にあるため、このクラスは必要な場合にだけ派生クラスでオーバーライドするようにします。

Object がリソースへの参照を保持している場合には、ガベージ コレクション中に Object が破棄される前にこれらのリソースを解放するため、 Finalize をオーバーライドする必要があります。

ファイル ハンドルやデータベース接続などのアンマネージ リソースを使用する型は、 Finalize を実装する必要があります。アンマネージ リソースは、そのリソースを使用するマネージ オブジェクトの再生時に解放する必要があります。この方法よりも制御可能で補足的なリソースの解放方法については、 IDisposable インターフェイスのトピックを参照してください。

Finalize は、ガベージ コレクション中にオブジェクトをクリーンアップした後のオブジェクトの再生 (オブジェクトを再度アクセスできる状態にする操作) を始め、あらゆる処理を実行できます。オブジェクトを再生できるのは 1 回だけです。ガベージ コレクション中に再生されたオブジェクトに対して Finalize を呼び出すことはできません。

[C#] デストラクタは、クリーンアップ操作を実行する C# の機構です。デストラクタには、基本型のデストラクタの自動呼び出しなどの適切な保護機能が備わっています。C# コードでは、 Object.Finalize の呼び出しやオーバーライドはできません。

必要条件

プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ, .NET Compact Framework - Windows CE .NET, Common Language Infrastructure (CLI) Standard

参照

Object クラス | Object メンバ | System 名前空間 | GC | WeakReference