Portée dans Visual BasicScope in Visual Basic

La portée d’un élément déclaré est le jeu de tout le code qui peut faire référence à celui-ci sans qualifier son nom ou le rendre disponible via une instruction Imports (espace de noms et type .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). Un élément peut avoir la portée à l’un des niveaux suivants :An element can have scope at one of the following levels:

LevelLevel DescriptionDescription
Portée de blocBlock scope Disponible uniquement dans le bloc de code dans lequel il est déclaréAvailable only within the code block in which it is declared
Portée de la procédureProcedure scope Disponible pour tout le code dans la procédure dans laquelle il est déclaréAvailable to all code within the procedure in which it is declared
Portée du moduleModule scope Disponible pour tout le code au sein du module, de la classe ou de la structure dans laquelle il est déclaréAvailable to all code within the module, class, or structure in which it is declared
Portée espace de nomsNamespace scope Disponible pour l’ensemble du code dans l’espace de noms dans lequel il est déclaréAvailable to all code in the namespace in which it is declared

Ces niveaux de la portée progressent du plus étroit (bloc) au plus large (espace de noms), où l’étendue la plus étroite correspond au plus petit ensemble de code qui peut faire référence à l’élément sans qualification.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. Pour plus d’informations, consultez « niveaux d’étendue » dans cette page.For more information, see "Levels of Scope" on this page.

Spécification de l’étendue et définition de variablesSpecifying Scope and Defining Variables

Vous spécifiez l’étendue d’un élément lorsque vous le déclarez.You specify the scope of an element when you declare it. L’étendue peut dépendre des facteurs suivants :The scope can depend on the following factors:

  • Région (bloc, procédure, module, classe ou structure) dans laquelle vous déclarez l’élémentThe region (block, procedure, module, class, or structure) in which you declare the element

  • Espace de noms contenant la déclaration de l’élément.The namespace containing the element's declaration

  • Le niveau d’accès que vous déclarez pour l’élémentThe access level you declare for the element

Soyez vigilant lorsque vous définissez des variables portant le même nom mais avec une étendue différente, car cela peut entraîner des résultats inattendus.Use care when you define variables with the same name but different scope, because doing so can lead to unexpected results. Pour plus d'informations, consultez References to Declared Elements.For more information, see References to Declared Elements.

Niveaux d’étendueLevels of Scope

Un élément de programmation est disponible dans l’ensemble de la région dans laquelle vous le déclarez.A programming element is available throughout the region in which you declare it. Tout le code dans la même région peut faire référence à l’élément sans qualifier son nom.All code in the same region can refer to the element without qualifying its name.

Portée de blocBlock Scope

Un bloc est un ensemble d’instructions placées dans des instructions de déclaration de début et de fin, comme suit :A block is a set of statements enclosed within initiating and terminating declaration statements, such as the following:

  • Do et LoopDo and Loop

  • For [Each] et NextFor [Each] and Next

  • If et End IfIf and End If

  • Select et End SelectSelect and End Select

  • SyncLock et End SyncLockSyncLock and End SyncLock

  • Try et End TryTry and End Try

  • While et End WhileWhile and End While

  • With et End WithWith and End With

Si vous déclarez une variable dans un bloc, vous pouvez l’utiliser uniquement dans ce bloc.If you declare a variable within a block, you can use it only within that block. Dans l’exemple suivant, la portée de la variable de type entier cube est le bloc entre If et End If, et vous ne pouvez plus faire référence à cube lorsque l’exécution passe en dehors du bloc.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

Notes

Même si l’étendue d’une variable est limitée à un bloc, sa durée de vie est toujours celle de la procédure entière.Even if the scope of a variable is limited to a block, its lifetime is still that of the entire procedure. Si vous entrez le bloc plus d’une fois pendant la procédure, chaque variable de bloc conserve sa valeur précédente.If you enter the block more than once during the procedure, each block variable retains its previous value. Pour éviter des résultats inattendus dans ce cas, il est préférable d’initialiser les variables de bloc au début du bloc.To avoid unexpected results in such a case, it is wise to initialize block variables at the beginning of the block.

Portée de la procédureProcedure Scope

Un élément déclaré dans une procédure n’est pas disponible en dehors de cette procédure.An element declared within a procedure is not available outside that procedure. Seule la procédure qui contient la déclaration peut l’utiliser.Only the procedure that contains the declaration can use it. Les variables à ce niveau sont également appelées variables locales.Variables at this level are also known as local variables. Vous les déclarez avec l' instruction Dim, avec ou sans le mot clé static .You declare them with the Dim Statement, with or without the Static keyword.

La portée de la procédure et du bloc sont étroitement liées.Procedure and block scope are closely related. Si vous déclarez une variable à l’intérieur d’une procédure mais en dehors d’un bloc au sein de cette procédure, vous pouvez considérer la variable comme ayant une portée de bloc, où le bloc correspond à la procédure entière.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.

Notes

Tous les éléments locaux, même s’ils sont Static des variables, sont privés pour la procédure dans laquelle ils apparaissent.All local elements, even if they are Static variables, are private to the procedure in which they appear. Vous ne pouvez pas déclarer d’élément à l’aide du mot clé public dans une procédure.You cannot declare any element using the Public keyword within a procedure.

Portée du moduleModule Scope

Pour plus de commodité, le niveau de module à simple terme s’applique de la même manière aux modules, aux classes et aux structures.For convenience, the single term module level applies equally to modules, classes, and structures. Vous pouvez déclarer des éléments à ce niveau en plaçant l’instruction de déclaration en dehors d’une procédure ou d’un bloc, mais au sein du module, de la classe ou de la structure.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.

Lorsque vous faites une déclaration au niveau du module, le niveau d’accès que vous choisissez détermine l’étendue.When you make a declaration at the module level, the access level you choose determines the scope. L’espace de noms qui contient le module, la classe ou la structure affecte également la portée.The namespace that contains the module, class, or structure also affects the scope.

Les éléments pour lesquels vous déclarez le niveau d’accès privé sont disponibles pour chaque procédure dans ce module, mais pas pour le code d’un autre module.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. L’instruction Dim au niveau du module est définie par défaut sur Private si vous n’utilisez pas de mots clés de niveau d’accès.The Dim statement at module level defaults to Private if you do not use any access level keywords. Toutefois, vous pouvez rendre l’étendue et le niveau d’accès plus évidents à l’aide du mot clé Private dans l’instruction Dim.However, you can make the scope and access level more obvious by using the Private keyword in the Dim statement.

Dans l’exemple suivant, toutes les procédures définies dans le module peuvent faire référence à la variable de chaîne strMsg.In the following example, all procedures defined in the module can refer to the string variable strMsg. Lorsque la deuxième procédure est appelée, elle affiche le contenu de la variable de chaîne strMsg dans une boîte de dialogue.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

Portée espace de nomsNamespace Scope

Si vous déclarez un élément au niveau du module à l’aide du mot clé Friend ou public , il devient disponible pour toutes les procédures dans l’espace de noms dans lequel l’élément est déclaré.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. Avec la modification suivante apporte à l’exemple précédent, la variable de chaîne strMsg peut être référencée par du code n’importe où dans l’espace de noms de sa déclaration.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

La portée espace de noms comprend des espaces de noms imbriqués.Namespace scope includes nested namespaces. Un élément disponible à partir d’un espace de noms est également disponible à partir de n’importe quel espace de noms imbriqué dans cet espace de noms.An element available from within a namespace is also available from within any namespace nested inside that namespace.

Si votre projet ne contient pas d' instruction d’espace de noms, tous les éléments du projet se trouvent dans le même espace de noms.If your project does not contain any Namespace Statements, everything in the project is in the same namespace. Dans ce cas, l’étendue de l’espace de noms peut être considérée comme la portée du projet.In this case, namespace scope can be thought of as project scope. Public éléments d’un module, d’une classe ou d’une structure sont également disponibles pour tous les projets qui font référence à leur projet.Public elements in a module, class, or structure are also available to any project that references their project.

Choix de l’étendueChoice of Scope

Lorsque vous déclarez une variable, gardez à l’esprit les points suivants lorsque vous choisissez son étendue.When you declare a variable, you should keep in mind the following points when choosing its scope.

Avantages des variables localesAdvantages of Local Variables

Les variables locales sont un bon choix pour tout type de calcul temporaire, pour les raisons suivantes :Local variables are a good choice for any kind of temporary calculation, for the following reasons:

  • Évitement des conflits de noms.Name Conflict Avoidance. Les noms de variables locales ne sont pas susceptibles d’être en conflit.Local variable names are not susceptible to conflict. Par exemple, vous pouvez créer plusieurs procédures différentes contenant une variable appelée intTemp.For example, you can create several different procedures containing a variable called intTemp. Tant que chaque intTemp est déclarée en tant que variable locale, chaque procédure reconnaît uniquement sa propre version de intTemp.As long as each intTemp is declared as a local variable, each procedure recognizes only its own version of intTemp. Toute procédure peut modifier la valeur de son intTemp local sans affecter les variables intTemp dans d’autres procédures.Any one procedure can alter the value in its local intTemp without affecting intTemp variables in other procedures.

  • Consommation de mémoire.Memory Consumption. Les variables locales consomment de la mémoire uniquement lorsque leur procédure est en cours d’exécution.Local variables consume memory only while their procedure is running. Leur mémoire est libérée lorsque la procédure retourne au code appelant.Their memory is released when the procedure returns to the calling code. En revanche, les variables partagées et statiques consomment des ressources mémoire jusqu’à ce que votre application cesse de s’exécuter. Utilisez-les uniquement lorsque cela est nécessaire.By contrast, Shared and Static variables consume memory resources until your application stops running, so use them only when necessary. Les variables d’instance consomment de la mémoire, tandis que leur instance continue à exister, ce qui les rend moins efficaces que les variables locales, mais potentiellement plus efficaces que les variables Shared ou 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.

Réduire l’étendueMinimizing Scope

En général, lors de la déclaration d’une variable ou d’une constante, il est recommandé de faire de la portée le plus étroit possible (la portée de bloc est la plus étroite).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). Cela permet d’économiser de la mémoire et réduit les chances que votre code fasse référence à la mauvaise variable.This helps conserve memory and minimizes the chances of your code erroneously referring to the wrong variable. De même, vous devez déclarer une variable comme étant statique uniquement lorsqu’il est nécessaire de conserver sa valeur entre les appels de procédure.Similarly, you should declare a variable to be Static only when it is necessary to preserve its value between procedure calls.

Voir aussiSee also