C#ではデストラクタ構文~Class()
、VBではFinalize
メソッドのオーバーライドによってファイナライザを実装することができます。 C#では、デストラクタ構文によってObject.Finalizeメソッドがオーバーライドされることになります。 (このため、厳密に言えばC#にデストラクタは存在しない)
ファイナライザを実装できるのは、クラスに限られます。 構造体でファイナライザを実装することはできません。 また、静的クラス・モジュール(VB)についても同様で、静的な(static
・Shared
な)ファイナライザを実装することはできません。
ファイナライザを実装する(Object.Finalizeをオーバーライドする)
using System;
class Resource {
// コンストラクタ
public Resource()
{
Console.WriteLine("constructed");
}
// ファイナライザ(デストラクタ構文によってObject.Finalizeをオーバーライドする)
~Resource()
{
Console.WriteLine("finalized");
}
}
class Sample {
static void AllocateAndRelease()
{
new Resource();
}
static void Main()
{
// オブジェクトを作成して、そのまま放棄する(破棄・解放ではない)
AllocateAndRelease();
// ガベージコレクションを行わせ、ファイナライザの呼び出しを待機する
// (例示のためのものであり、通常は不必要に呼び出すものではない)
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
実行結果
constructed finalized
この例で使用しているGC.Collectメソッド・GC.WaitForPendingFinalizersメソッドについては§.ガベージコレクタへの要求 (GCクラス)を参照してください。