次の方法で共有


方法 : 変数の有効期間を延長する

更新 : 2007 年 11 月

通常、変数が宣言されているプログラミング要素が存在しなくなると、変数も存在しなくなります。ただし、Static (Visual Basic) キーワードを使用して宣言すると、その変数のコンテナ要素より変数の有効期間を延長できます。

詳細については、「Visual Basic における有効期間」を参照してください。

コンテナ要素より変数の有効期間を延長するには

  • 変数がローカル変数 (プロシージャ内で宣言) である場合は、これを宣言している Dim ステートメント (Visual Basic) に Static キーワードを含めます。静的変数は、変数を宣言しているプロシージャを含むクラスまたはモジュールが存続している限り有効です。

    ローカル変数が Shared (Visual Basic) プロシージャ内部にある場合、そのプロシージャと変数は、アプリケーションが実行されている間有効です。この場合には Static を使用しないでください。

  • 変数がメンバ変数 (プロシージャ外部のクラスまたは構造体で宣言) である場合は、その変数を宣言している Dim ステートメントに Shared キーワードを含めます。共有変数はどのクラスまたは構造体のインスタンスにも関連付けられておらず、アプリケーションが実行されている間存在します。メンバ変数に対して Static は使用できません。

    メンバ変数がモジュール内で宣言されている場合、アプリケーションが実行されている間、常に存在します。この場合には Shared を使用しないでください。

使用例

Static (Visual Basic) キーワードを使用して変数を宣言する例を、次に示します (Dim ステートメント (Visual Basic) で、Static などの修飾子を使用している場合は、Dim キーワードは不要です)。

Function runningTotal(ByVal num As Integer) As Integer
    Static applesSold As Integer
    applesSold = applesSold + num
    Return applesSold
End Function

前の例では、変数 applesSold は、プロシージャ runningTotal が呼び出し元のコードに戻された後でも、引き続き存在します。次に runningTotal が呼び出されたとき、applesSold は前に計算した値を保持しています。

Static を使用しないで applesSold が宣言された場合、は runningTotal が呼び出されても事前に蓄積された値は保持されません。次に runningTotal が呼び出されたときに、applesSold は再作成され、0 に初期化されます。runningTotal は、呼び出されたときと同じ値を返すだけです。

コードのコンパイル方法

静的ローカル変数の値は、宣言の一部として初期化できます。配列を Static として宣言する場合は、ランク (次元数)、各次元の長さ、および各要素の値を初期化できます。

同じ名前の静的変数

複数のプロシージャで、同じ名前の静的変数を宣言できます。これを実行すると、Visual Basic のコンパイラは、このような各変数は別々の要素であると見なします。いずれか 1 つの変数を初期化しても、その他の変数の値には影響しません。これは、一連のオーバーロードを持つプロシージャを定義し、それぞれのオーバーロードで同じ名前の静的変数を定義した場合も同様です。

静的変数のコンテナ要素

静的ローカル変数は、クラス内 (つまりクラスのプロシージャの中) で宣言できます。ただし、構造体のメンバまたはその構造体内部のプロシージャのローカル変数のいずれとしてでも、ローカルの静的変数を構造体内部で宣言することはできません。

セキュリティ

前の例では、applesSold をモジュール レベルで宣言して、同じ有効期間にできます。ただし、この方法で変数のスコープを変更すると、プロシージャが変数に排他的にアクセスできなくなります。この場合、他のプロシージャが applesSold にアクセスして値を変更する可能性があるため、現在の合計を信頼できなくなり、コードの管理が難しくなります。

参照

概念

Visual Basic における有効期間

宣言された要素の特性

Visual Basic におけるスコープ

Visual Basic でのアクセス レベル

Visual Basic における変数

Visual Basic での変数宣言

プロシージャのオーバーロード