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.

Voir aussi