Le premier site francophone dédié au développement Pocket PC


Byval et Byref
 
   


eVB permet, comme beaucoup de langages, de créer des fonctions ou des procédures qui acceptent des paramètres. Cette fonctionnalité permet de créer des programmes plus lisibles et plus structurés.

Avec eVB, il est possible de passer des paramètres avec le mot clé "Byval" ou avec le mot clé "ByRef". Nous allons apprendre dans cet article quelle est la différence entre ces 2 mots clés et donc à quoi ils servent.

Le passage de paramètres

Pour créer une fonction ou une procédure paramétrée sous eVB il suffit d'énumérer les paramètres dans la partie déclaration de la procédure ou fonction. Ainsi, si l'on veut créer la fonction 'Somme' qui retourne la somme de deux réels simple (Single) on peut écrire :

Function Somme(n1 As Single, n2 As Single) As Single
 Somme = n1 + n2
End Function

et l'appel à cette fonction sera par exemple :

Dim s As Single
s = Somme(5, 7)

n1 et n2 sont les paramètres de la fonction "Somme", ce sont tous deux des variables de type Single, et la fonction nous retourne un Single aussi, en somme, tout va bien.

Mais je peux écrire aussi :

Function Somme(Byval n1 As Single, Byval n2 As Single) As Single
 Somme = n1 + n2
End Function

Je viens de rajouter le mot clé Byval avant n1 et n2...
Quelle est la différence avec l'autre notation ?

Il faut savoir qu'il y a pour eVB 2 moyens pour passer un paramètre à une fonction ou une méthode. Le passage par référence, et le passage par valeur...

Le passage par référence : Byref

Le passage par référence est le mode par défaut de eVB. Si vous ne précisez rien, eVB considère que vous effectuez un passage par référence. Le mot clé eVB pour indiquer explicitement un passage par référence est "Byref" :

Function Somme(ByRef n1 As Single, Byref n2 As Single) As Single

Avec ce mode de passage, c'est uniquement les adresses mémoire des paramètres "n1" et "n2" qui sont passées à la fonction "Somme". Ceci sous entend que si dans le code de "Somme" vous modifiez la valeur de "n1" ou de "n2", vous modifiez aussi la valeur des variables qui ont servies à passer les paramètres :

Function Somme(Byref n1 As Single, Byref n2 As Single) As Single
 Somme = n1 + n2
 n1 = n2 / 2
End Function

Si j'utilise cette fonction en passant en paramètre des variables :

Dim s As Single
Dim p1 As Single
Dim p2 As Single

p1 = 10
p2 = 100
s = Somme(p1, p2)

Au retour de la fonction "Somme", "s" sera égale à 110 (10+100), p1 à 50 (et oui !!), et p2 sera toujours égale à 100. Comme dans la fonction "Somme" j'ai modifié la valeur de "n1", et bien "p1" qui a servi à passer la valeur à "n1" est modifiée aussi. En fait, avec le passage par référence, "p1" et "n1" font référence à la même zone de stockage de variable.

Ce système peut être très puissant si par exemple nous devons récupérer plusieurs valeurs en retour. En effet, une fonction ne peut retourner qu'une seule valeur, alors qu'avec le passage de paramètre par référence, on peut en retourner à volonté :

Sub DivMul2(Byref Valeur As Single, Byref Div As Single, Byref Mul As Single)
 Div = Valeur/2
 Mul = Valeur*2
End Sub

La procédure "DivMul2" retourne par l'intermédaire de ces paramètres "Div" et "Mul" le résultat de la division par 2 et le résultat de la multiplication par 2 du paramètre "Valeur" :

Dim ResultDiv As Single
Dim ResultMul As Single

Call DivMul2(100, ResultDiv, ResultMul)

Au retour de "DivMul2", "ResultDiv" est égale à 50 et "ResultMul" à 200, magique !

Le passage par valeur : ByVal

Avec le mot clé "Byval", eVB effectue une copie de la valeur du paramètre passé. Ainsi, il n'y a plus aucun lien entre la variable qui a servi à passer le paramètre et le paramètre lui même. Si nous reprenons notre exemple de tout à l'heure avec "Byval" à la place de "ByRef" :

Function Somme(Byval n1 As Single, Byval n2 As Single) As Single
 Somme = n1 + n2
 n1 = n2 / 2
End Function

Si j'utilise cette fonction en passant en paramètre des variables :

Dim s As Single
Dim p1 As Single
Dim p2 As Single

p1 = 10
p2 = 100
s = Somme(p1, p2)

Au retour de la fonction "Somme", "s" sera égale à 110 (10+100), p1 toujours à 10, et p2 sera toujours égale à 100. Le fait de modifier dans "Somme" la valeur du paramètre "n1" n'a eu aucune répercution sur "p1" car eVB à effectué une copie intermédiaire qui en quelque sorte protège "p1" des manipulations de "n1".

Cette méthode de passage est un peu plus lente que la méthode par référence, car si vous passez des paramètres volumineux (une grosse chaine de caractères par exemple) eVB doit en effectuer une copie, par contre cette méthode est plus sécurisée.

Conclusion

La conclusion de cet article est simple, utilisez Byval ou Byref à votre guise en ayant toujours en tête ce que permet l'une (avec des bêtises parfois à la clé) et ce que bloque l'autre (mais avec sécurité).

Stéphane Sibué

 

 
       
   
 
   
Copyright 2001-2004 - Tous droits réservés
 
   

iPAQ est un produit de COMPAQ.
Visual Tools est un produit de Microsoft Corporation.
Toutes les autres marques et produits présents dans ces pages sont la propriété exclusive de leurs sociétés respectives.