Share via


コンポーネントの初期化と終了

更新 : 2007 年 11 月

コンポーネントは、コンストラクタ (Visual Basic の場合、SubNew) によって初期化され、デストラクタ (Visual Basic の場合、SubFinalize) によって破棄されます。コンポーネントのコンストラクタは、コンポーネントのインスタンス作成時に呼び出されます。それより後に呼び出されることはありません。デストラクタは、ガベージ コレクションによりコンポーネントが破棄されてメモリがクリアされる直前に呼び出されます。

ws9dc6t6.alert_note(ja-jp,VS.90).gifVisual Basic メモ :

Visual Basic の以前のバージョンでは、Initialize イベントと Terminate イベントがコンストラクタとデストラクタの役割を果たしていました。

ガベージ コレクション待ち

実行中のいずれのコードからもコンポーネントが呼び出されないとガベージ コレクションが判定した場合、共通言語ランタイムはコンポーネントのデストラクタを呼び出します。これは、当該コンポーネントへの参照がすべて解放されている場合に起こります。また、実行中のコードから完全に独立したオブジェクトだけが当該コンポーネントを参照している場合 (循環参照の場合など) にも起こります。

ユーザーがコンポーネントの使用を終えてからデストラクタが呼び出されるまでには時間差が生じ得るため、.NET Framework コンポーネントの有効期間に処理手順を追加する必要があります。コンポーネントがデータベースとの接続や Windows のシステム オブジェクトを識別するハンドルなどのシステム リソースを取得する場合は、IDisposable インターフェイスを実装してください。また、コンポーネントのユーザーがリソースの解放タイミングを指定するための Dispose メソッドを用意してください。

コンポーネントの有効期間

型の初期化: コンポーネントの最初のインスタンスを作成した場合は、実行される最初のコードが共有初期化コードです。共有メンバへの参照を行っても共有コンストラクタが実行されます。初期化されるすべての共有フィールド (メンバ変数) および、もしあれば、共有コンストラクタ (SharedSubNew) もこれに含まれます。クラス全体の参照フォントを作成するコードを次に示します。

ws9dc6t6.alert_note(ja-jp,VS.90).gifメモ :

Shared に相当する C# のキーワードは、static です。Visual Basic の Static キーワードと混同しないでください。

メソッドを実装するタイミング

Component から継承するコンポーネントの場合は、Dispose の実装が既定で用意されています。この実装をオーバーライドして、独自のクリーン アップ コードを提供できます。IComponent の実装を独自に作成してコンポーネントをビルドする場合は、IDisposable を実装してコンポーネントに Dispose メソッドを用意してください。

システム オブジェクト、データベース接続、またはユーザーが使用を終えたらすぐに解放する必要のある希少なリソースを割り当てるコンポーネントには、Dispose メソッドが必要です。

Dispose メソッドを持つ他のオブジェクトへの参照があるコンポーネントにも、Dispose メソッドを実装する必要があります。

Dispose の実装理由

システムの利用状況によっては、ユーザーがコンポーネントの使用を終えてから、コンポーネントのコードに到達できないことをガベージ コレクションが検出するまで、予測できない間隔が空くことがあります。Dispose メソッドを用意しないと、コンポーネントはこの間中、リソースを保持し続けます。

最悪の事態

データベース接続を使用し、Dispose メソッドを持たないサーバー コンポーネントを想像してください。大量のメモリを搭載するサーバーでは、空きメモリに大きな影響を与えずにコンポーネントのインスタンスを多数作成して解放することもできます。この場合、コンポーネントへの参照が解放されてからしばらくの間は、ガベージ コレクションではコンポーネントが破棄されないことがあります。

その結果、使用できるデータベース接続のすべてが、解放済みで破棄されていないコンポーネントに使用されたままになってしまうこともあります。そのため、サーバーのメモリが不足していなくても、ユーザーの要求に応じられなくなる可能性があります。

参照

処理手順

方法 : デザイン モードでコンポーネントを作成および設定する

概念

コンポーネント クラスの特性

Visual Basic .NET におけるコンポーネントのインスタンス化の変更点

参照

Dispose

Finalize