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整数変数のスコープはとEnd Ifの間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. これらの宣言は、 Staticキーワードの有無にかかわらず、 Dim ステートメントを使用して宣言します。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

便宜上、単項モジュールレベルはモジュール、クラス、および構造体にも同様に適用されます。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.

プライベートアクセスレベルを宣言する要素は、そのモジュール内のすべてのプロシージャで使用できますが、別のモジュール内のコードには使用できません。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. ただし、 Private Dimステートメントでキーワードを使用すると、スコープとアクセスレベルをより明確にすることができます。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.

プロジェクトに名前空間ステートメントが含まれていない場合、プロジェクト内のすべてのものが同じ名前空間にあります。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. 1つのプロシージャでは、他のプロシージャ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. これに対し、共有変数と静的変数は、アプリケーションが実行を停止するまでメモリリソースを消費するため、必要な場合にのみ使用します。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. 同様に、プロシージャ呼び出し間で値を保持する必要がある場合にのみ、変数を静的に宣言する必要があります。Similarly, you should declare a variable to be Static only when it is necessary to preserve its value between procedure calls.

関連項目See also