方法: 変数のスコープを制御する (Visual Basic)

通常、変数は、スコープ内にあります。つまり、それを宣言した領域全体で可視になり参照できます。 場合によって、変数のアクセス レベルがそのスコープに影響を与えることがあります。

詳細については、「 Scope in Visual Basic」を参照してください。

ブロック レベルまたはプロシージャ レベルのスコープ

変数をブロック内でのみ可視にするには

  • 変数の Dim ステートメントを、そのブロックの開始と終了の宣言ステートメントの間、たとえば For ループの For ステートメントと Next ステートメントの間などに配置します。

    変数は、ブロック内からのみ参照できます。

変数をプロシージャ内でのみ可視にするには

  • 変数の Dim ステートメントをプロシージャ内、ただし、ブロック (With...End With ブロックなど) の外部に配置します。

    プロシージャに含まれている任意のブロック内など、プロシージャ内からのみ変数を参照できます。

モジュールまたは名前空間レベルのスコープ

便宜上、モジュール レベルという 1 つの用語は、モジュール、クラス、および構造体に等しく適用されます。 モジュール レベル変数のアクセスレベルによってそのスコープが決まります。 モジュール、クラス、または構造体を含む名前空間もスコープに影響します。

変数をモジュール、クラス、または構造体全体で可視にするには

  1. モジュール、クラス、または構造体の内部で、ただしプロシージャの外部に、変数の Dim ステートメントを配置します。

  2. Dim ステートメントに Private キーワードを含めます。

  3. 変数は、モジュール、クラス、または構造体内のどこからでも参照できますが、その外部から参照することはできません。

変数を名前空間全体で可視にするには

  1. モジュール、クラス、または構造体の内部で、ただしプロシージャの外部に、変数の Dim ステートメントを配置します。

  2. Dim ステートメントに Friend または Public キーワードを含めます。

  3. 変数は、モジュール、クラス、または構造体を含む名前空間内のどこからでも参照できます。

次の例では、モジュール レベルで変数を宣言し、その可視性をモジュール内のコードに制限しています。

Module demonstrateScope  
    Private strMsg As String  
    Sub initializePrivateVariable()  
        strMsg = "This variable cannot be used outside this module."  
    End Sub  
    Sub usePrivateVariable()  
        MsgBox(strMsg)  
    End Sub  
End Module  

前の例では、モジュール demonstrateScope に定義されているすべてのプロシージャで、String 変数 strMsg を参照できます。 strMsg プロシージャを呼び出すと、文字列変数 usePrivateVariable の内容がダイアログ ボックスに表示されます。

前の例を次のように変更すると、文字列変数 strMsg は、その宣言の名前空間内のどこでもコードによって参照できます。

Public strMsg As String  

信頼性の高いプログラミング

変数のスコープを狭めるほど、同じ名前を持つ別の変数の代わりに、誤ってそれを参照してしまう可能性が低くなります。 参照マッチングに関する問題を最小限に抑えることもできます。

.NET Framework セキュリティ

変数のスコープを狭めるほど、悪意のあるコードによってそれが不正使用される可能性が低くなります。

関連項目