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