方法: 変数のスコープを制御する (Visual Basic)
通常、変数は、スコープ内にあります。つまり、それを宣言した領域全体で可視になり参照できます。 場合によって、変数のアクセス レベルがそのスコープに影響を与えることがあります。
詳細については、「 Scope in Visual Basic」を参照してください。
ブロック レベルまたはプロシージャ レベルのスコープ
変数をブロック内でのみ可視にするには
変数の Dim ステートメントを、そのブロックの開始と終了の宣言ステートメントの間、たとえば
For
ループのFor
ステートメントとNext
ステートメントの間などに配置します。変数は、ブロック内からのみ参照できます。
変数をプロシージャ内でのみ可視にするには
変数の
Dim
ステートメントをプロシージャ内、ただし、ブロック (With
...End With
ブロックなど) の外部に配置します。プロシージャに含まれている任意のブロック内など、プロシージャ内からのみ変数を参照できます。
モジュールまたは名前空間レベルのスコープ
便宜上、モジュール レベルという 1 つの用語は、モジュール、クラス、および構造体に等しく適用されます。 モジュール レベル変数のアクセスレベルによってそのスコープが決まります。 モジュール、クラス、または構造体を含む名前空間もスコープに影響します。
変数をモジュール、クラス、または構造体全体で可視にするには
モジュール、クラス、または構造体の内部で、ただしプロシージャの外部に、変数の
Dim
ステートメントを配置します。Dim
ステートメントに Private キーワードを含めます。変数は、モジュール、クラス、または構造体内のどこからでも参照できますが、その外部から参照することはできません。
変数を名前空間全体で可視にするには
モジュール、クラス、または構造体の内部で、ただしプロシージャの外部に、変数の
Dim
ステートメントを配置します。変数は、モジュール、クラス、または構造体を含む名前空間内のどこからでも参照できます。
例
次の例では、モジュール レベルで変数を宣言し、その可視性をモジュール内のコードに制限しています。
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 セキュリティ
変数のスコープを狭めるほど、悪意のあるコードによってそれが不正使用される可能性が低くなります。
関連項目
.NET