エクスポート (0) 印刷
すべて展開
情報
要求されたトピックは次のとおりです。しかし、このトピックはこのライブラリには含まれていません。

Object.Finalize メソッド

2013/12/12

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

Namespace:  System
アセンブリ:  mscorlib (mscorlib.dll 内)

protected virtual void Finalize()

Finalize メソッドは、現在のオブジェクトが破棄される前に、現在のオブジェクトによって保持されているアンマネージ リソースをクリーンアップするために使用されます。メソッドは保護されているため、このクラスまたは派生クラスを使用したときだけアクセスできます。

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

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

メモメモ:

C# コンパイラでは Finalize メソッドを直接実装することはできないので、C# デストラクターはその基本クラスのデストラクターを自動的に呼び出します。

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 を実装する必要があります。アンマネージ リソースは、そのリソースを使用するマネージ オブジェクトの再生時に解放する必要があります。

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

[C#]

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

次の例では、Finalize をオーバーライドするオブジェクトが破棄されるときに Finalize メソッドが呼び出されることを検証します。実際のアプリケーションでは、オブジェクトによって保持されているアンマネージ リソースを解放するために、Finalize メソッドをオーバーライドします。また、C# の例では、Finalize メソッドをオーバーライドする代わりに、デストラクターを提供することに注意してください。

Windows Phone OS

サポート: 8.0, 7.1, 7.0

表示:
© 2014 Microsoft