宣言された要素の 有効期間 は、使用できる期間です。 変数は、有効期間を持つ唯一の要素です。 このため、コンパイラはプロシージャ パラメーターと関数の戻り値を変数の特殊なケースとして扱います。 変数の有効期間は、変数が値を保持できる期間を表します。 その値は有効期間中に変更される可能性がありますが、常に何らかの値を保持します。
異なる有効期間
メンバー変数 (モジュール レベルで宣言され、プロシージャの外部で宣言される) は、通常、それが宣言されている要素と同じ有効期間を持ちます。 クラスまたは構造体で宣言された非共有変数は、それが宣言されているクラスまたは構造体のインスタンスごとに個別のコピーとして存在します。 このような各変数は、インスタンスと同じ有効期間を持ちます。 ただし、 Shared
変数の有効期間は 1 つだけで、アプリケーションが実行されている間は存続します。
ローカル変数 (プロシージャ内で宣言) は、それが宣言されているプロシージャの実行中にのみ存在します。 これは、そのプロシージャのパラメーターおよび関数の戻り値にも適用されます。 ただし、そのプロシージャが他のプロシージャを呼び出す場合、ローカル変数は呼び出されたプロシージャの実行中に値を保持します。
有効期間の開始
ローカル変数の有効期間は、コントロールが宣言されているプロシージャに入ると開始されます。 すべてのローカル変数は、プロシージャの実行が開始されるとすぐに、そのデータ型の既定値に初期化されます。 プロシージャは、初期値を指定する Dim
ステートメントを検出すると、コードで既に他の値が割り当てられている場合でも、それらの変数をそれらの値に設定します。
構造体変数の各メンバーは、個別の変数であるかのように初期化されます。 同様に、配列変数の各要素は個別に初期化されます。
プロシージャ内のブロック内で宣言された変数 ( For
ループなど) は、プロシージャへのエントリで初期化されます。 これらの初期化は、コードがブロックを実行したかどうかに関係なく有効になります。
有効期間の終了
プロシージャが終了すると、そのローカル変数の値は保持されず、Visual Basic によってメモリが再利用されます。 次にプロシージャを呼び出すと、そのすべてのローカル変数が新たに作成され、再初期化されます。
クラスまたは構造体のインスタンスが終了すると、その非共有変数はメモリとその値を失います。 クラスまたは構造体の新しい各インスタンスは、その非共有変数を作成して再初期化します。 ただし、 Shared
変数は、アプリケーションの実行が停止するまで保持されます。
有効期間の延長
Static
キーワードを使用してローカル変数を宣言すると、プロシージャの実行時間よりも有効期間が長くなります。 次の表は、プロシージャ宣言によって、 Static
変数が存在する期間を決定する方法を示しています。
プロシージャの場所と共有 | 静的変数の有効期間が開始されます | 静的変数の有効期間の終了 |
---|---|---|
モジュール内 (既定で共有) | プロシージャを初めて呼び出す場合 | アプリケーションの実行が停止したとき |
クラスでは、 Shared (プロシージャはインスタンス メンバーではありません) |
プロシージャが特定のインスタンスで、またはクラス名または構造体名自体で初めて呼び出される場合 | アプリケーションの実行が停止したとき |
Shared ではなく、クラスのインスタンス (プロシージャはインスタンス メンバー) |
特定のインスタンスで初めてプロシージャを呼び出す場合 | インスタンスがガベージ コレクション (GC) 用に解放されたとき |
同じ名前の静的変数
複数のプロシージャで、同じ名前の静的変数を宣言できます。 これを行うと、Visual Basic コンパイラは、このような各変数を個別の要素と見なします。 これらの変数の 1 つの初期化は、他の変数の値には影響しません。 一連のオーバーロードを持つプロシージャを定義し、各オーバーロードで同じ名前の静的変数を宣言する場合も同様です。
静的変数の要素を含む
静的ローカル変数は、クラス内、つまりそのクラスのプロシージャ内で宣言できます。 ただし、構造体内の静的ローカル変数は、構造体メンバーとして宣言することも、その構造体内のプロシージャのローカル変数として宣言することもできません。
例
説明
次の例では、 Static キーワードを使用して変数を宣言します。 (Dim ステートメントで Static
などの修飾子を使用する場合は、Dim
キーワードは必要ありません)。
コード
Function runningTotal(ByVal num As Integer) As Integer
Static applesSold As Integer
applesSold = applesSold + num
Return applesSold
End Function
コメント
前の例では、プロシージャrunningTotal
呼び出し元のコードに戻った後も、変数applesSold
は引き続き存在します。 次回 runningTotal
が呼び出されるときに、 applesSold
は以前に計算された値を保持します。
applesSold
Static
を使用せずに宣言されていた場合、runningTotal
の呼び出し間で以前の累積値は保持されません。 次回 runningTotal
が呼び出されたとき、 applesSold
は再作成されて 0 に初期化され、 runningTotal
は呼び出されたのと同じ値を返すだけです。
コードをコンパイルする
静的ローカル変数の値は、宣言の一部として初期化できます。 配列を Static
宣言する場合は、そのランク (次元数)、各ディメンションの長さ、および個々の要素の値を初期化できます。
安全
前の例では、モジュール レベルで applesSold
を宣言することで、同じ有効期間を生成できます。 ただし、このように変数のスコープを変更した場合、プロシージャはそれへの排他的アクセス権を持たなくなります。 他のプロシージャは applesSold
にアクセスしてその値を変更できるため、実行中の合計が信頼性が低く、コードの保守が困難になる可能性があります。
こちらも参照ください
.NET