Object.Finalize メソッド
アセンブリ: mscorlib (mscorlib.dll 内)


Finalize は保護されているため、このクラスまたは派生クラスを使用したときだけアクセスできす。
SuppressFinalize 呼び出しによる終了操作の対象であるオブジェクトにアクセスできなくなった場合に、このメソッドが自動的に呼び出されます。アプリケーション ドメインのシャットダウン中に、終了処理の対象であるオブジェクトに対して Finalize が自動的に呼び出されます。このメソッドは、これらのオブジェクスがアクセス可能な場合でも呼び出されます。オブジェクトが ReRegisterForFinalize などの機構を使用して再登録された後、GC.SuppressFinalize が呼び出されている場合を除き、Finalize は特定のインスタンスに対して自動的に 1 回だけ呼び出されます。
派生型での Finalize 実装は、その基本型の Finalize 実装を呼び出す必要があります。この条件を満たしている場合にだけ、アプリケーション コードで Finalize を呼び出すことができます。
-
ガベージ コレクション実行中のファイナライザの実行時期は未定義です。Close メソッドまたは Dispose メソッドを呼び出さない限り、特定の時点でリソースが解放されることは保証されません。
-
2 つのオブジェクトのファイナライザが特定の順序で実行されることは保証されません。これは、1 つのオブジェクトがもう 1 つのオブジェクトを参照している場合にも同様です。つまり、オブジェクト A がオブジェクト B を参照しており、どちらのオブジェクトにもファイナライザがある場合、オブジェクト A のファイナライザが開始した時点でオブジェクト B が既に終了していることがあります。
次に示す状況では、Finalize メソッドが完了しないことや、このメソッドがまったく実行されないことがあります。
-
別のファイナライザが無期限にブロックしている。たとえば、無限にループしているか、取得不可能なロックを取得しようとしている場合など。ランタイムが完了処理のためにファイナライザを実行しようとしているため、ファイナライザが無期限にブロックしている場合には、他のファイナライザが呼び出されません。
-
ランタイムがクリーンアップを実行する前に、プロセスが終了した。この場合、プロセス終了をランタイムへ伝える最初の通知は DLL_PROCESS_DETACH 通知です。
シャットダウン中にはランタイムがオブジェクトの Finalize を続行しますが、終了できるオブジェクトの数は減少し続けます。
Finalize、または Finalize のオーバーライドが例外をスローし、既定のポリシーをオーバーライドするアプリケーションがランタイムをホストしていない場合、ランタイムはプロセスを終了し、アクティブな try-finally ブロックもファイナライザも実行されません。この動作により、ファイナライザがリソースを解放または破棄できない場合にも、プロセスの整合性が保証されます。
実装時の注意 既定では Object.Finalize は何も実行しません。Finalize を実行する必要がある場合には、ガベージ コレクションによるメモリ収集に時間がかかる傾向にあるため、このクラスは必要な場合にだけ派生クラスでオーバーライドするようにします。 Object がリソースへの参照を保持している場合には、ガベージ コレクション中に Object が破棄される前にこれらのリソースを解放するため、Finalize をオーバーライドする必要があります。 ファイル ハンドルやデータベース接続などのアンマネージ リソースを使用する型は、Finalize を実装する必要があります。アンマネージ リソースは、そのリソースを使用するマネージ オブジェクトの再生時に解放する必要があります。この方法よりも制御可能で補足的なリソースの解放方法については、IDisposable インターフェイスのトピックを参照してください。 Finalize は、ガベージ コレクション中にオブジェクトをクリーンアップした後のオブジェクトの再生 (オブジェクトを再度アクセスできる状態にする操作) を始め、あらゆる処理を実行できます。オブジェクトを再生できるのは 1 回だけです。ガベージ コレクション中に再生されたオブジェクトに対して Finalize を呼び出すことはできません。デストラクタは、クリーンアップ操作を実行する C# の機構です。デストラクタには、基本型のデストラクタの自動呼び出しなどの適切な保護機能が備わっています。C# コードでは、Object.Finalize の呼び出しやオーバーライドはできません。

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


- Object.Finalize メソッドのページへのリンク