ファイナライザはガベージコレクタからによってのみ呼び出されるものであるため、ファイナライザを実装してもそれを直接・明示的に呼び出すことはできません。 また、オブジェクトを明示的に破棄するdelete obj
のような構文もありません。 VB6以前に存在したSet obj = Nothing
のようなNothing
の代入は、.NETのVBにおいては単に参照の放棄となり、即座にオブジェクトの破棄(およびファイナライザの呼び出し)を指示するものとはなりません。 C#におけるnull
の代入も同様です。
ファイナライザを直接・明示的に呼び出すことはできない
Imports System
Class Resource
Protected Overrides Sub Finalize()
End Sub
Public Sub Free()
Me.Finalize() ' コンパイルエラーとはならないが、このような呼び出しは避けたほうがよい(IDisposable.Disposeを実装すべき)
End Sub
End Class
Class Sample
Shared Sub Main()
Dim res As New Resource()
res.Finalize() ' error BC30390: 'Resource.Protected Overrides Sub Finalize()' は 'Protected' であるため、このコンテキストではアクセスできません。
Set res = Nothing ' error BC30807: 'Let' および 'Set' 代入ステートメントはサポートされなくなりました。
res = Nothing ' 単に参照が放棄されるだけで、オブジェクトの破棄・ファイナライザ呼び出しを直接指示するものとはならない
End Sub
End Class
何らかの終了処理・解放処理を行わせたい場合は、ファイナライザを直接呼び出すのではなく、IDisposable.Disposeメソッドあるいは専用のメソッドを用意し、それを呼び出すようにします。
ファイナライザがオーバーライドされたクラスを継承し、派生クラスでもファイナライザを実装するような場合については、§.ファイナライザとIDisposableのデザインパターン (disposeパターン)を参照してください。