Durée de vie dans Visual Basic
La durée de vie d’un élément déclaré correspond à la période pendant laquelle il peut être utilisé. Les variables sont les seuls éléments qui ont une durée de vie. C’est pourquoi le compilateur traite les paramètres de procédure et les retours de fonction comme des cas spéciaux de variables. La durée de vie d’une variable représente la période pendant laquelle elle peut contenir une valeur. Sa valeur peut changer au cours de sa durée de vie, mais elle en contient toujours une.
Différentes durées de vie
Une variable membre (déclarée au niveau du module, en dehors de toute procédure) a généralement la même durée de vie que l’élément dans lequel elle est déclarée. Une variable non partagée déclarée dans une classe ou une structure existe en tant que copie distincte pour chaque instance de la classe ou de la structure dans laquelle elle est déclarée. Chacune de ces variables a la même durée de vie que son instance. Toutefois, une variable Shared
n’a qu’une seule durée de vie, qui correspond à toute la durée d’exécution de votre application.
Une variable locale (déclarée au sein d’une procédure) existe uniquement pendant l’exécution de la procédure dans laquelle elle est déclarée. Cela s’applique également aux paramètres de cette procédure et à tout retour de fonction. Toutefois, si cette procédure appelle d’autres procédures, les variables locales conservent leurs valeurs pendant l’exécution des procédures appelées.
Début de la durée de vie
La durée de vie d’une variable locale commence lorsque le contrôle entre dans la procédure dans laquelle elle est déclarée. Chaque variable locale est initialisée avec la valeur par défaut de son type de données dès que la procédure commence à s’exécuter. Lorsque la procédure rencontre une instruction Dim
qui spécifie les valeurs initiales, elle définit ces variables avec ces valeurs, même si votre code leur avait déjà attribué d’autres valeurs.
Chaque membre d’une variable de structure est initialisé comme s’il s’agissait d’une variable distincte. De même, chaque élément d’une variable de tableau est initialisé individuellement.
Les variables déclarées dans un bloc au sein d’une procédure (par exemple, une boucle For
) sont initialisées à l’entrée de la procédure. Ces initialisations prennent effet, que votre code exécute ou non le bloc.
Fin de la durée de vie
Lorsqu’une procédure prend fin, les valeurs de ses variables locales ne sont pas conservées et Visual Basic récupère leur mémoire. La prochaine fois que vous appellerez la procédure, toutes ses variables locales seront recréées et réinitialisées.
Lorsqu’une instance d’une classe ou d’une structure prend fin, ses variables non partagées perdent leur mémoire et leurs valeurs. Chaque nouvelle instance de la classe ou de la structure crée et réinitialise ses variables non partagés. Toutefois, les variables Shared
sont conservées jusqu’à ce que votre application cesse de s’exécuter.
Extension de la durée de vie
Si vous déclarez une variable locale avec le mot clé Static
, sa durée de vie est supérieure à la durée d’exécution de sa procédure. Le tableau suivant montre comment la déclaration de procédure détermine la durée de l’existence d’une variable Static
.
Emplacement et partage de la procédure | La durée de vie des variables statiques commence | La durée de vie des variables statiques finit |
---|---|---|
Dans un module (partagé par défaut) | La première fois que la procédure est appelée | Lorsque votre application cesse de s’exécuter |
Dans une classe, Shared (la procédure n’est pas un membre d’instance) |
La première fois que la procédure est appelée sur une instance spécifique ou sur le nom de la classe ou la structure lui-même | Lorsque votre application cesse de s’exécuter |
Dans une instance d’une classe, non Shared (la procédure est un membre d’instance) |
La première fois que la procédure est appelée sur l’instance spécifique | Quand l’instance est libérée pour le nettoyage de la mémoire (garbage collection) |
Variables statiques du même nom
Vous pouvez déclarer des variables statiques portant le même nom dans plusieurs procédures. Dans ce cas, le compilateur Visual Basic considère chacune de ces variables comme des éléments distincts. L’initialisation de l’une de ces variables n’affecte pas les valeurs des autres. Il en est de même si vous définissez une procédure avec un ensemble de surcharges et déclarez une variable statique portant le même nom dans chaque surcharge.
Éléments conteneur pour les variables statiques
Vous pouvez déclarer une variable locale statique au sein d’une classe, c’est-à-dire au sein d’une procédure de cette classe. Toutefois, vous ne pouvez pas déclarer une variable locale statique au sein d’une structure, soit en tant que membre de la structure, soit en tant que variable locale d’une procédure au sein de cette structure.
Exemple
Description
L’exemple suivant déclare une variable avec le mot clé Static. (Notez que vous n’avez pas besoin du mot clé Dim
lorsque l’instruction Dim utilise un modificateur tel que Static
.)
Code
Function runningTotal(ByVal num As Integer) As Integer
Static applesSold As Integer
applesSold = applesSold + num
Return applesSold
End Function
Commentaires
Dans l’exemple précédent, la variable applesSold
continue d’exister une fois que la procédure runningTotal
est retournée au code appelant. La prochaine fois que runningTotal
sera appelée, applesSold
conservera sa valeur calculée précédemment.
Si applesSold
avait été déclaré sans utiliser Static
, les valeurs accumulées précédentes ne seraient pas conservées entre les appels à runningTotal
. La prochaine fois que runningTotal
aurait été appelée, applesSold
aurait été recréée et initialisée avec la valeur 0, et runningTotal
aurait simplement retourné la même valeur que celle avec laquelle elle avait été appelée.
Compiler le code
Vous pouvez initialiser la valeur d’une variable locale statique dans le cadre de sa déclaration. Si vous déclarez qu’un tableau est Static
, vous pouvez initialiser son rang (nombre de dimensions), la longueur de chaque dimension et les valeurs des éléments individuels.
Sécurité
Dans l’exemple précédent, vous pouvez produire la même durée de vie en déclarant applesSold
au niveau du module. Toutefois, si vous changiez l’étendue d’une variable de cette façon, la procédure n’y aurait plus d’accès exclusif. Étant donné que d’autres procédures pourraient accéder à applesSold
et changer sa valeur, le total en cours d’exécution pourrait devenir non fiable et le code pourrait être plus difficile à gérer.