Visual Basic におけるスコープScope in Visual Basic

宣言された要素のスコープは、その名前を修飾したり、Imports ステートメント (.NET 名前空間および型) から使用できるようにしたりしなくても、それを参照できるすべてのコードのセットです。The scope of a declared element is the set of all code that can refer to it without qualifying its name or making it available through an Imports Statement (.NET Namespace and Type). 要素には、次のいずれかのレベルのスコープを設定できます。An element can have scope at one of the following levels:

レベルLevel 説明Description
ブロック スコープBlock scope それが宣言されているコード ブロック内でのみ使用可能Available only within the code block in which it is declared
プロシージャ スコープProcedure scope それが宣言されているプロシージャ内のすべてのコードで使用可能Available to all code within the procedure in which it is declared
モジュール スコープModule scope それが宣言されているモジュール、クラス、または構造体内のすべてのコードで使用可能Available to all code within the module, class, or structure in which it is declared
名前空間スコープNamespace scope それが宣言されている名前空間内のすべてのコードで使用可能Available to all code in the namespace in which it is declared

これらのスコープのレベルは、最も狭い (ブロック) から最も広い (名前空間) まで進展します。ここで、最も狭いスコープとは、修飾せずに要素を参照できる最小限のコードのセットを意味します。These levels of scope progress from the narrowest (block) to the widest (namespace), where narrowest scope means the smallest set of code that can refer to the element without qualification. 詳細については、このページの「スコープのレベル」を参照してください。For more information, see "Levels of Scope" on this page.

スコープの指定と変数の定義Specifying Scope and Defining Variables

要素のスコープは、それを宣言するときに指定します。You specify the scope of an element when you declare it. スコープは、次の要因によって異なる場合があります。The scope can depend on the following factors:

  • 要素を宣言する領域 (ブロック、プロシージャ、モジュール、クラス、または構造体)The region (block, procedure, module, class, or structure) in which you declare the element

  • 要素の宣言を含む名前空間The namespace containing the element's declaration

  • 要素に対して宣言するアクセス レベルThe access level you declare for the element

同じ名前だがスコープが異なる変数を定義する場合は、それによって予期しない結果につながる可能性があるため、注意してください。Use care when you define variables with the same name but different scope, because doing so can lead to unexpected results. 詳細については、「 References to Declared Elements」を参照してください。For more information, see References to Declared Elements.

スコープのレベルLevels of Scope

プログラミング要素は、それを宣言する領域全体で使用できます。A programming element is available throughout the region in which you declare it. 同じリージョン内のすべてのコードでは、その名前を修飾せずに要素を参照できます。All code in the same region can refer to the element without qualifying its name.

ブロック スコープBlock Scope

ブロックは、次のように、開始と終了の宣言ステートメントに囲まれた一連のステートメントです。A block is a set of statements enclosed within initiating and terminating declaration statements, such as the following:

  • Do および LoopDo and Loop

  • For [Each] および NextFor [Each] and Next

  • If および End IfIf and End If

  • Select および End SelectSelect and End Select

  • SyncLock および End SyncLockSyncLock and End SyncLock

  • Try および End TryTry and End Try

  • While および End WhileWhile and End While

  • With および End WithWith and End With

ブロック内で変数を宣言すると、そのブロック内でのみそれを使用できます。If you declare a variable within a block, you can use it only within that block. 次の例で、整数変数 cube のスコープは IfEnd If の間のブロックであるため、実行がブロックから出ると、cube を参照できなくなります。In the following example, the scope of the integer variable cube is the block between If and End If, and you can no longer refer to cube when execution passes out of the block.

If n < 1291 Then
    Dim cube As Integer
    cube = n ^ 3
End If

注意

変数のスコープがブロックに制限されている場合でも、その有効期間はプロシージャ全体の有効期間になります。Even if the scope of a variable is limited to a block, its lifetime is still that of the entire procedure. プロシージャの実行中にブロックに複数回入る場合、各ブロック変数で前の値が保持されます。If you enter the block more than once during the procedure, each block variable retains its previous value. そのような場合に予期しない結果を避けるには、ブロックの先頭でブロック変数を初期化することをお勧めします。To avoid unexpected results in such a case, it is wise to initialize block variables at the beginning of the block.

プロシージャ スコープProcedure Scope

プロシージャ内で宣言された要素は、そのプロシージャの外部で使用できません。An element declared within a procedure is not available outside that procedure. 宣言を含むプロシージャだけがそれを使用できます。Only the procedure that contains the declaration can use it. このレベルの変数は、ローカル変数とも呼ばれます。Variables at this level are also known as local variables. それらは、Dim ステートメントで、Static キーワードを付けるか、または付けないで、宣言します。You declare them with the Dim Statement, with or without the Static keyword.

プロシージャとブロックのスコープは密接に関連しています。Procedure and block scope are closely related. プロシージャ内の、ただしそのプロシージャ内のいずれかのブロックの外部で変数を宣言した場合、その変数はブロック スコープを持つと考えることができます。その場合ブロックはプロシージャ全体になります。If you declare a variable inside a procedure but outside any block within that procedure, you can think of the variable as having block scope, where the block is the entire procedure.

注意

すべてのローカル要素は、Static 変数であっても、それらが存在するプロシージャに対してプライベートです。All local elements, even if they are Static variables, are private to the procedure in which they appear. プロシージャ内で Public キーワードを使用して要素を宣言することはできません。You cannot declare any element using the Public keyword within a procedure.

モジュール スコープModule Scope

便宜上、モジュール レベルという 1 つの用語は、モジュール、クラス、および構造体に等しく適用されます。For convenience, the single term module level applies equally to modules, classes, and structures. このレベルで要素を宣言するには、宣言ステートメントをプロシージャまたはブロックの外部で、ただしモジュール、クラス、または構造体内に配置します。You can declare elements at this level by placing the declaration statement outside of any procedure or block but within the module, class, or structure.

モジュール レベルで宣言を行うと、選択したアクセス レベルによってスコープが決まります。When you make a declaration at the module level, the access level you choose determines the scope. モジュール、クラス、または構造体を含む名前空間もスコープに影響します。The namespace that contains the module, class, or structure also affects the scope.

Private アクセス レベルを宣言した要素は、そのモジュール内のすべてのプロシージャで使用できますが、別のモジュール内のコードでは使用できません。Elements for which you declare Private access level are available to every procedure in that module, but not to any code in a different module. アクセス レベル キーワードを使用しない場合、モジュール レベルの Dim ステートメントは既定で Private になります。The Dim statement at module level defaults to Private if you do not use any access level keywords. ただし、Dim ステートメントで Private キーワードを使用することで、スコープとアクセス レベルをより明確にすることができます。However, you can make the scope and access level more obvious by using the Private keyword in the Dim statement.

次の例では、モジュールに定義されているすべてのプロシージャで、文字列変数 strMsg を参照できます。In the following example, all procedures defined in the module can refer to the string variable strMsg. 2 番目のプロシージャを呼び出すと、ダイアログ ボックスに strMsg 文字列変数の内容が表示されます。When the second procedure is called, it displays the contents of the string variable strMsg in a dialog box.

' Put the following declaration at module level (not in any procedure).
Private strMsg As String
' Put the following Sub procedure in the same module.
Sub initializePrivateVariable()
    strMsg = "This variable cannot be used outside this module."
End Sub
' Put the following Sub procedure in the same module.
Sub usePrivateVariable()
    MsgBox(strMsg)
End Sub

名前空間スコープNamespace Scope

Friend または Public キーワードを使用して、要素をモジュール レベルで宣言すると、その要素が宣言されている名前空間全体のすべてのプロシージャで使用できるようになります。If you declare an element at module level using the Friend or Public keyword, it becomes available to all procedures throughout the namespace in which the element is declared. 前の例を次のように変更すると、文字列変数 strMsg は、宣言の名前空間内の任意の場所でコードによって参照できます。With the following alteration to the preceding example, the string variable strMsg can be referred to by code anywhere in the namespace of its declaration.

' Include this declaration at module level (not inside any procedure).
Public strMsg As String

名前空間スコープには、入れ子になった名前空間が含まれます。Namespace scope includes nested namespaces. 名前空間内から使用できる要素は、その名前空間内に入れ子になっているすべての名前空間内からも使用できます。An element available from within a namespace is also available from within any namespace nested inside that namespace.

プロジェクトに Namespace ステートメント が含まれていない場合、プロジェクトのすべてのものが同じ名前空間内にあります。If your project does not contain any Namespace Statements, everything in the project is in the same namespace. この場合、名前空間スコープはプロジェクト スコープと考えることができます。In this case, namespace scope can be thought of as project scope. モジュール、クラス、または構造体内の Public 要素は、そのプロジェクトを参照するすべてのプロジェクトでも使用できます。Public elements in a module, class, or structure are also available to any project that references their project.

スコープの選択Choice of Scope

変数を宣言する場合、そのスコープを選択するときに、次の点に注意する必要があります。When you declare a variable, you should keep in mind the following points when choosing its scope.

ローカル変数の利点Advantages of Local Variables

ローカル変数は、次の理由で、あらゆる種類の一時的な計算に適しています。Local variables are a good choice for any kind of temporary calculation, for the following reasons:

  • 名前の競合の回避。Name Conflict Avoidance. ローカル変数名は競合する可能性がありません。Local variable names are not susceptible to conflict. たとえば、intTemp という変数を含む複数の異なるプロシージャを作成できます。For example, you can create several different procedures containing a variable called intTemp. intTemp がローカル変数として宣言されている限り、各プロシージャではその独自のバージョンの intTemp のみが認識されます。As long as each intTemp is declared as a local variable, each procedure recognizes only its own version of intTemp. 他のプロシージャの intTemp 変数に影響を与えることなく、あるプロシージャで、そのローカル intTemp の値を変更できます。Any one procedure can alter the value in its local intTemp without affecting intTemp variables in other procedures.

  • メモリの使用量。Memory Consumption. ローカル変数は、プロシージャの実行中にのみメモリを消費します。Local variables consume memory only while their procedure is running. それらのメモリは、プロシージャが呼び出し元のコードに戻ったときに解放されます。Their memory is released when the procedure returns to the calling code. これに対し、Shared 変数と Static 変数では、アプリケーションが実行を停止するまでメモリ リソースが消費されるため、必要な場合にのみそれらを使用してください。By contrast, Shared and Static variables consume memory resources until your application stops running, so use them only when necessary. インスタンス変数では、それらのインスタンスが存在し続ける間メモリが消費されるので、ローカル変数よりも非効率的ですが、Shared または Static 変数よりも効率的である可能性があります。Instance variables consume memory while their instance continues to exist, which makes them less efficient than local variables, but potentially more efficient than Shared or Static variables.

スコープの最小化Minimizing Scope

一般に、変数または定数を宣言するときは、スコープを可能な限り狭くすることをお勧めします (ブロック スコープが最も狭い)。In general, when declaring any variable or constant, it is good programming practice to make the scope as narrow as possible (block scope is the narrowest). これにより、メモリを節約し、コードで間違った変数を誤って参照する可能性が最小限に抑えられます。This helps conserve memory and minimizes the chances of your code erroneously referring to the wrong variable. 同様に、プロシージャ呼び出しの間でその値を保持する必要がある場合にのみ、変数を Static として宣言する必要があります。Similarly, you should declare a variable to be Static only when it is necessary to preserve its value between procedure calls.

関連項目See also