destructor


POINT  コンストラクタはインスタンスの内容を正しい状態からスタートさせるために重要な機能. 一方デストラクタの役割は C++など他のプログラム言語に比べて、重要度は下がっている。 デストラクタが担ってきた役割を もっと別のもので交代させていくべきと言えるかもしれない。   デストラクタとは、コンストラクタの逆の役割を持った機能である。 インスタンスが消滅する際に呼び出されるメソッドである。 C# では System が Instance の寿命を管理する. ので, Destructor が走る Timing は Control できない. WARNING C++ なら、デストラクタに開いたファイルを閉じる処理を記述することも可能だが、 C#で同じように記述すると、いつファイルを閉じるか予測不可能と言うことになり、 トラブルの元になりかねない。 デストラクタは、いつ実行されるか分からない。 ある範囲の実行を終えた時点で確実に何かの終了処理を実行させたい場合は、例外処理を使うのが普通である。
static private void test() { Console.WriteLine("static private void test() called"); Class2 t1 = new Class2(); try { // 何かの処理がここにあると想像してください } finally { t1.close(); } Console.WriteLine("static private void test() done"); } static void Main(string[] args)
POINT IDisposable と using を利用すると, 確実な終了処理を記述できる. IDisposable と using による終了処理 IDisposable というインターフェースと、using というステートメントを使うと、 確実な終了処理を記述できる。 相変わらずデストラクタはずっと後になって実行されている。 つまり、Dispose メソッドが呼び出されたからと言って、 インスタンスが消滅したわけではないのである。 Disposeメソッドは後処理を行うチャンスをくれるもの
class Class2: IDisposable { ~Class2() { Console.WriteLine("Class2's destructor called"); } // 確実に呼び出す終了処理 void IDisposable.Dispose() { Console.WriteLine("void IDisposable.Dispose() called"); } } class Class1 { static private void test() { Console.WriteLine("static private void test() called"); // この使い方で, IDisposable の Dispose() を呼ぶらしい. 確実な終了処理をさせたいクラスで、IDisposable インターフェイスを実装する これには、Dispose メソッドしかないので、 そして、usingステートメントを使って、インスタンスを生成する using(Class2 t1 = new Class2()) { // ここに何かの処理があると想像してください } Console.WriteLine("static private void test() done"); } static void Main(string[] args) { Console.WriteLine("static void Main(string[] args) called"); test(); Console.WriteLine("static void Main(string[] args) done"); } }