Visual Basic における有効期間
更新 : 2007 年 11 月
宣言された要素の有効期間とは、その要素を使用できる期間です。変数は、有効期間がある唯一の要素です。このために、コンパイラでは、プロシージャ パラメータおよび関数の戻り値が、変数の特別な例として扱われます。変数の有効期間は、変数が値を保持できる期間を表します。保持されている値は変わっても、有効期間中は常になんらかの値が保持されています。
さまざまな有効期間
(プロシージャ外部の、モジュール レベルで宣言された) メンバ変数は、通常、宣言された要素と同じ有効期間を持っています。クラスまたは構造体で宣言された非共有変数は、宣言されたクラスまたは構造体の各インスタンスの別個のコピーとして存在します。そのような各変数は、インスタンスと同じ有効期間を持っています。ただし、共有 (Shared) 変数の有効期間は 1 つだけで、アプリケーションが終了するまで存続します。
(プロシージャの内部で宣言された) ローカル変数は、宣言されたプロシージャが実行されている間だけ存在します。そのプロシージャのパラメータ、および関数の戻り値についても同様です。ただし、プロシージャが他のプロシージャを呼び出した場合は、呼び出されたプロシージャの実行中もローカル変数の値は保持されます。
有効期間の開始
ローカル変数の有効期間は、宣言されたプロシージャの制御が開始されるときに始まります。すべてのローカル変数は、プロシージャの実行が開始されるとすぐに、データ型の既定値に初期化されます。プロシージャは、初期値を指定する Dim ステートメントを検出すると、コードで他の値が既に割り当てられていたとしても、その初期値をローカル変数に設定します。
構造体変数の各メンバは、独立した変数として初期化されます。同様に、配列変数の各要素も個別に初期化されます。
プロシージャ内部のブロック内で宣言された変数 (For ループなど) は、そのプロシージャへのエントリ時点で初期化されます。これらの初期化は、コードによってそのブロックが実行されるかどうかにかかわらず、有効になります。
有効期間の終了
プロシージャが終了すると、ローカル変数の値は保持されず、Visual Basic によってメモリが解放されます。次にプロシージャを呼び出すときに、すべてのローカル変数が再度作成され、再初期化されます。
クラスまたは構造体のインスタンスが終了すると、非共有変数はメモリおよび値を失います。クラスまたは構造体のそれぞれの新しいインスタンスによって、非共有変数が作成および再初期化されます。しかし、Shared 変数はアプリケーションが実行を停止するまで保持されます。
有効期間の延長
Static キーワードを持つローカル変数を宣言した場合、有効期間はプロシージャの実行時間よりも長くなります。Static 変数が存在する長さが、どのようにプロシージャ宣言によって決定されるのかを、次の表に示します。
プロシージャの場所および共有 |
静的変数の有効期間の開始 |
静的変数の有効期間の終了 |
---|---|---|
モジュール内 (既定で共有) |
プロシージャが最初に呼び出されたとき |
アプリケーションの実行が停止されたとき |
クラスまたは構造体の Shared (プロシージャはインスタンス メンバではありません) |
特定のインスタンス、またはクラス名や構造体名自体のいずれかで、プロシージャが最初に呼び出されたとき |
アプリケーションの実行が停止されたとき |
Shared ではなく、クラスまたは構造体のインスタンス (プロシージャはインスタンス メンバではありません) |
特定のインスタンスで、プロシージャが最初に呼び出されたとき |
ガベージ コレクション (GC) に対して、インスタンスが解放されたとき |