Mécanisme de passage de paramètres pour les utilisateurs de Visual Basic 6.0

Mise à jour : novembre 2007

Visual Basic 2008 introduit plusieurs modifications affectant la manière dont les arguments sont passés aux procédures.

Mécanisme de passage d'arguments par défaut

Visual Basic 6.0

Dans Visual Basic 6.0, si vous ne spécifiez pas ByVal ou ByRef dans un paramètre de procédure, le mécanisme de passage utilise ByRef par défaut. De cette façon, la variable passée dans la procédure peut être modifiée dans le programme appelant.

Exposer une variable à la modification peut comporter certains dangers. Dans l'exemple suivant, le mécanisme de passage utilise par défaut ByRef, la valeur elapsedSeconds est modifiée par minutesPastHour, et elapsedSeconds est donc affichée de façon incorrecte par MsgBox :

Function minutesPastHour(seconds As Integer) As Integer 
    Dim hours As Integer = seconds \ 3600 
    seconds = seconds Mod 3600 
    Return seconds \ 60 
End Function 
Sub showSecondsAndMinutes() 
    Dim elapsedSeconds, extraMinutes As Integer 
    elapsedSeconds = CInt(Timer()) ' Integer seconds since midnight. 
    extraMinutes = minutesPastHour(elapsedSeconds) 
    MsgBox "Total seconds: " & elapsedSeconds & _ 
        "; minutes past hour: " & extraMinutes 
End Sub 

Le passage d'un argument ByRef permet à une procédure de modifier cet argument dans le programme appelant, ce qui peut donner lieu à un comportement imprévu. De plus, si cette procédure en appelle une autre et passe le même argument ByRef, les risques de voir la variable d'origine modifiée par inadvertance sont accrus.

Visual Basic 2008

Lorsque vous déclarez une procédure dans Visual Basic 2008, le mécanisme de passage est par défaut sur ByVal pour chaque paramètre. Il s'agit là d'une mesure destinée à empêcher toute modification des arguments. La déclaration de l'exemple précédent peut être réécrite comme suit.

Function MinutesPastHour(ByVal Seconds As Integer) As Integer

Le passage de seconds par valeur empêche que la procédure n'accède à la variable dans le programme appelant et contribue à éviter les dangers que nous venons de décrire.

Bien que ByVal soit utilisé comme mécanisme de passage par défaut, en le spécifiant explicitement pour chaque paramètre, le code, libéré de toute ambiguïté, devient plus facile à lire.

Arguments de propriété ByRef

Visual Basic 6.0

Dans Visual Basic 6.0, une propriété passée à une procédure en tant qu'argument ByRef est copiée dans cette procédure, mais elle ne peut pas en être extraite. Cela signifie que toute modification d'un argument de propriété de ce genre n'est pas réfléchie sur la propriété d'origine dans le programme appelant, bien que cet argument ait été passé avec ByRef.

Visual Basic 2008

Dans Visual Basic 2008, un argument de propriété passé ByRef est copié à la fois en dedans et en dehors de la procédure. L'exemple suivant montre comment une propriété peut être modifiée par une procédure.

Sub Reduce(ByRef Height As Single)
' ... ... ... ... ... ... ...  ' Code to modify Height argument. 
End Sub
Dim Sq As Square = New Square  ' Square has property Side of type Single. 
Reduce(Sq.Side)                ' Side is changed when Reduce returns. 

Quand une procédure modifie un argument de propriété, la valeur de la propriété d'origine n'est pas modifiée immédiatement dans le programme appelant. Au lieu de cela, elle est extraite dès le retour à la procédure.

Arguments ParamArray

Visual Basic 6.0

Dans Visual Basic 6.0, une procédure peut spécifier le mot clé ParamArray sur le dernier de ses arguments pour accepter un tableau d'arguments Variant. Il est impossible de déclarer le mécanisme de passage de ces arguments. Ces derniers sont toujours passés avec ByRef.

Visual Basic 2008

Dans Visual Basic 2008, les arguments ParamArray sont toujours passés ByVal. Les arguments du tableau doivent tous être du même type de données que l'argument ParamArray.

Voir aussi

Concepts

Déclaration de procédure pour les utilisateurs de Visual Basic 6.0

Séquence d'appel de procédure pour les utilisateurs de Visual Basic 6.0

Tableaux de paramètres

Récapitulatif des modifications relatives à la prise en charge des éléments de programmation

Référence

Function, instruction (Visual Basic)

Sub, instruction (Visual Basic)

ByVal

ByRef

ParamArray