C#ではデストラクタ構文~Class()、VBではFinalizeメソッドのオーバーライドによってファイナライザを実装することができます。 C#では、デストラクタ構文によってObject.Finalizeメソッドがオーバーライドされることになります。 (このため、厳密に言えばC#にデストラクタは存在しない)

ファイナライザを実装できるのは、クラスに限られます。 構造体でファイナライザを実装することはできません。 また、静的クラス・モジュール(VB)についても同様で、静的な(staticSharedな)ファイナライザを実装することはできません。

ファイナライザを実装する(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クラス)を参照してください。

MENTAにてテキストチャットによるサポートを行っています。 問題の解決法をお探しの方や.NET/C#を学習中の方はどうぞご利用ください。