Finalize メソッドのオーバーライド
更新 : 2007 年 11 月
Finalize メソッドは、Dispose メソッドが呼び出されなかった場合にリソースをクリーンアップするための安全装置として動作します。Finalize メソッドは、アンマネージ リソースをクリーンアップするためにだけ実装するようにしてください。マネージ リソースのクリーンアップはガベージ コレクタが自動的に行うので、Finalize メソッドはマネージ オブジェクトに対しては実装しないでください。既定では、Object.Finalize メソッドは何も実行しません。ガベージ コレクタが、オブジェクトのメモリを再利用する前にオブジェクトをクリーンアップするようにするには、クラス内でこのメソッドをオーバーライドする必要があります。
メモ : |
---|
C# プログラミング言語または C++ プログラミング言語で Finalize メソッドをオーバーライドすることはできません。C# では、デストラクタ構文を使用して、Finalize メソッドを実装します。.NET Framework Version 2.0 の C++ には Finalize メソッドを実装するための独自の構文が用意されています。詳細については、「Destructors and Finalizers in Visual C++」を参照してください。それ以前のバージョンでは C++ でも、C# と同じように、Finalize メソッドに対してデストラクタ構文が使用されていました。 |
Object.Finalize メソッドのスコープは "protected" です。クラス内でこのメソッドをオーバーライドする場合は、このスコープの範囲を維持する必要があります。Finalize メソッドを protected にしておくことで、アプリケーションのユーザーがオブジェクトの Finalize メソッドを直接呼び出すことを防ぐことができます。
オブジェクトの Finalize メソッドでは、そのオブジェクトが保持しているすべてのリソースを解放する必要があります。また、そのオブジェクトの基本クラスの Finalize メソッドを呼び出す必要もあります。オブジェクトの Finalize メソッドでは、基本クラス以外のオブジェクトのメソッドを呼び出さないでください。これは、共通言語ランタイムがシャットダウンされる場合など、呼び出し元のオブジェクトと呼び出された別のオブジェクトが同時にガベージ コレクションされることがあるからです。
Finalize メソッドを抜け出すためになんらかの例外を許容すると、システムではこのメソッドが返されたものと想定し、他のオブジェクトの Finalize メソッドの呼び出しを継続します。