ファイナライザはガベージコレクタからによってのみ呼び出されるものであるため、ファイナライザを実装してもそれを直接・明示的に呼び出すことはできません。 また、オブジェクトを明示的に破棄するdelete obj
のような構文もありません。 VB6以前に存在したSet obj = Nothing
のようなNothing
の代入は、.NETのVBにおいては単に参照の放棄となり、即座にオブジェクトの破棄(およびファイナライザの呼び出し)を指示するものとはなりません。 C#におけるnull
の代入も同様です。
ファイナライザを直接・明示的に呼び出すことはできない
using System;
class Resource {
~Resource() {}
public void Free()
{
~Resource(); // error CS1955: 実行不可能なメンバー 'Resource' をメソッドのように使用することはできません。
Finalize(); // error CS0245: デストラクター と object.Finalize を直接呼び出すことはできません。使用可能であれば IDisposable.Dispose を呼び出してください。
}
}
class Sample {
static void Main()
{
var res = new Resource();
res.~Resource(); // error CS1001: 識別子がありません
res.Finalize(); // error CS0122: 'Resource.~Resource()' はアクセスできない保護レベルになっています
//delete res; // このような構文は存在しない
res = null; // 単に参照が放棄されるだけで、オブジェクトの破棄・ファイナライザ呼び出しを直接指示するものとはならない
}
}
何らかの終了処理・解放処理を行わせたい場合は、ファイナライザを直接呼び出すのではなく、IDisposable.Disposeメソッドあるいは専用のメソッドを用意し、それを呼び出すようにします。
ファイナライザがオーバーライドされたクラスを継承し、派生クラスでもファイナライザを実装するような場合については、§.ファイナライザとIDisposableのデザインパターン (disposeパターン)を参照してください。