このサイトをご覧になっている方のうち、コンストラクタとデストラクタについて調べている方が多かったので、このページで簡単に解説いたします。
● Dispose
最初に書いておきますが、Disposeとデストラクタは違います。
(よく混同して紹介しているページがありますが。。。汗)
紛らわしいので違いがわかるよう、ここではあえてDisposeについても触れてみました。コンストラクタとデストラクタについてはDispose以降に記述してあります。
Disposeを使う場面は、作成したクラスが.NET Frameworkの管理下に無いリソースを使用していて、明示的な解放処理が必要な場合にこのDisposeを実装します。
たとえば、このサイトではExcelの操作方法を公開していますが、Excelアプリケーションは.NET Frameworkの管理下には無いため、明示的に解放しないと「exeを終了したのに、exeから呼び出していたExcelアプリケーションがタスクマネージャに残ってる!」なんてことがよく起こります。
<宣言方法>※ほぼ自動生成コードです。
#Region "Dispose" Private disposedValue As Boolean = False ' 重複する呼び出しの検出用 ' IDisposable Protected Overridable Sub Dispose(ByVal disposing As Boolean) If Not Me.disposedValue Then If disposing Then ' TODO: 他の状態を解放します (マネージ オブジェクト)。 End If ' TODO: 共有のアンマネージ リソースを解放します ' ※※※※※※※※※※※※※※※※※ ' ※ ここにリソースの解放を書く! ※ ' ※※※※※※※※※※※※※※※※※ End If Me.disposedValue = True End Sub #Region " IDisposable Support " ' このコードは、破棄可能なパターンを正しく実装できるように Visual Basic によって追加されました。 Public Sub Dispose() Implements IDisposable.Dispose ' このコードを変更しないでください。クリーンアップ コードを上の Dispose(ByVal disposing As Boolean) に記述します。 Dispose(True) GC.SuppressFinalize(Me) End Sub #End Region #End Region '
● コンストラクタ
動的クラスのインスタンスが生成されるときに実行される処理で、VB.NETで言うところの、「New」が該当します。
VB.NETを使う方にとっては馴染みのあるものだと思いますので、詳しい説明は省略します。
<宣言方法>
''' <summary> ''' パラメータなし コンストラクタ ''' </summary> ''' <remarks></remarks> Public Sub New() ' *********************************************** ' クラスインスタンスと同時に行う処理をここに書く ' *********************************************** End Sub '
● デストラクタ
インスタンス生成時に実行される「New」とは対照的に、インスタンス破棄のタイミングで実行される処理です。VB.NETはFinalizeがデストラクタにあたります。
Disposeとの違いは、Disposeは明示的に呼び出したタイミングで実行する処理なのに対し、Finalizeはガベージコレクタが回収に来たタイミングで実行される処理です。
使い方は人それぞれあると思いますが、一般的にFinalizeは.NET Frameworkの管理下にあるリソースの解放処理を実装し、Disposeは.NET Frameworkの管理下に無いリソースの解放処理をすることが多いです。
<宣言方法>
''' <summary> ''' デストラクタ ''' </summary> ''' <remarks></remarks> Protected Overrides Sub Finalize() MyBase.Finalize() ' Disposeが呼ばれてなかったら呼び出す If disposedValue = False Then Me.Dispose() End If End Sub '