Visual Basicのコレ(Advent Calendar 2011)にも参加したので何かネタを^^
きっと難しいことはVisual BasicのMVPな人たちが書いてくれるはずなので、簡単なおさらいなど^^;
#以下は、ホリデーシーズンの影響で、かなり独断と偏見に満ちあふれていますw
で、Java使いやC♯erから結構よく聞かれるのは、「VBのデストラクタってどうやって書くの?」です。
いわゆるコンストラクタはNewメソッドの実装で行われるということは割と普通に有名みたいです。
ではデストラクタは?
さて、もともとプロトタイピングツール?といわれたVBは20年周年(VB1.0 1991年6月)。
もともとVBにクラスなんて概念はありませんでした。
順調に成長を続けて、Visual Basic 4.0ではクラスモジュールが追加され、初期化と解放にはInitializeイベントとTerminateイベントが用意されました。
つまり、Visual Basic的な考え方では、初期化時と解放時にはイベントが呼び出されると言う文化が醸成されていると言えると思います。
ここで、注意していただきたいのは、C系でイベントプログラミングをされる方は、イベントは購読の登録をすればよく、イベントとハンドラが1対多の関係に違和感を感じません。しかし、伝統的にVBではイベントとハンドラは1対1だったため、いまだにVBerには1対1になってないと、気持ち悪がる人が多いように思います。
以上を踏まえて、まずはコンストラクタから。
初期化はイベントで、それは1対1であるという文化で問題になるのは、いわゆるコンストラクタは引数の数などがオーバーロードできるため、同じクラス内で複数個のコンストラクタがないと不便であるということです。
なので、コンストラクタはVisual Basic 7(いわゆる、.NET版)からは、Newメソッド化するという荒業に出ています。
次に、デストラクタです。では、オブジェクトを破壊するということはどういうことでしょうか。
端的に言って、作成したインスタンスを開放して無くしてくれる動作になります。
では、誰が開放して無くすのか?それはランタイムですよね。いわゆるガベージコレクタです。
要は、デストラクタは、ガベージコレクタがお掃除するときに呼び出されるものです。
.NETのランタイムでは、いわゆるFinalizeメソッドがこれに当たります。
つまり、VBでは、クラスのFinalizeメソッドがデストラクタにあたります。
そして、以前のイベント時代と同じようなUIで記述することが可能です^^(オーバーロードがないため、VBerにはイベントに見えるw)
ちなみに、C#でもデストラクタは暗黙的にFinalizeを呼び出します。
(というか、VBerからしてみれば、そちらさんのほうがヘンテコな書き方用意しやがって。ともかく、あのニョロのセンスは何事?と思ってしますわけです^^;)
おまけ:
Finalizeメソッドを実装すると、ガベージコレクタが動作するときに、Finalizeを呼び出すために解放が1世代遅れてしまいます。
ということで、用がないのでしたら、実装しないに越したことはありません。
ということで、結論
コンストラクタ:Newメソッド
デストラクタ:Finalizeメソッド
【ご参考】
「コンストラクタとデストラクタの使用方法」(VB)
http://msdn.microsoft.com/ja-jp/library/2z08e49e(v=VS.90).aspx
「Finalize メソッドおよびデストラクタ」(C#)
http://msdn.microsoft.com/ja-jp/library/0s71x931(v=VS.90).aspx
「C# ガベージコレクション」
http://uchukamen.com/Programming/GC/