ByVal ou byRef

Résolu
cuq
Messages postés
345
Date d'inscription
mardi 3 juin 2003
Statut
Membre
Dernière intervention
21 mars 2008
- 27 mai 2005 à 17:27
cs_Jack
Messages postés
14007
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
- 1 juin 2005 à 19:15
Petite question,

Pour passer des variables à une fonction ou une subroutine est-il préférable d'utiliser : byVal ou byRef

Quel est le mode le plus rapide ?

Merci

14 réponses

Gobillot
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
33
27 mai 2005 à 17:57
le plus rapide c'est Byref, pas de création de copie.

le plus sécurisant c'est ByVal, impossible de modifier la variable puisque c'est une copie temporaire.
par défaut c'est byRef en vb6 et byVal en vb.Net


Daniel
3
bidoch78
Messages postés
67
Date d'inscription
mercredi 27 février 2002
Statut
Membre
Dernière intervention
2 décembre 2005

31 mai 2005 à 11:53
C'est vrai que le type string est un peu particulier (http://vb.mvps.org/tips/varptr.asp).

Du coup j'ai fait une petite recherche pour répondre à la question initiale :-) et il semble que

- pour les Integer, Long et Single, ByVal est plus rapide que ByRef

http://www.codeguru.com/forum/showthread.php?t=339608

- pour microsoft si la méthode qui recoit l'argument n'a pas besoin de le modifier alors utiliser ByVal sinon ByRef (pour moi c'est le principe meme de ces options)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbcon98/html/vbconoptimizingcode.asp

- Pour ma part, j'ai testé avec une petite routine et le passage par ByRef d'une chaine de caracteres est plus rapide qu'avec ByVal.

un autre tuto http://www.developerfusion.com/show/1763/1/

Bidoch78
3
cs_drahcir
Messages postés
745
Date d'inscription
mardi 30 novembre 2004
Statut
Membre
Dernière intervention
15 septembre 2009
4
27 mai 2005 à 17:30
Salut,

je dirais byVal mais je ne connaît pas bien le mot clé byRef (je ne pratique pas le vb.net depuis trés longtemps). En fait les réponses m'intéressent aussi.

@+
0
bidoch78
Messages postés
67
Date d'inscription
mercredi 27 février 2002
Statut
Membre
Dernière intervention
2 décembre 2005

27 mai 2005 à 18:02
byval => passage du parametre par valeur (une copie de la variable est effectué)
sécurité lors de la manipulation de la variable par des fonctions

byref => passage du parametre par référence (une référence est passée)
possibilité par la fonction de modifié la variable

dans Vb6, byref est normalement plus rapide que byval (pas necessairement sous .Net)

Bidoch78
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Gobillot
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
33
27 mai 2005 à 18:19
vous faites rire avec références et valeurs.

valeur veut dire qu'on s'intéresse à la valeur c'est à dire au contenu de la variable et référence c'est la variable qui compte.

dans tous les cas c'est toujours l'adresse d'une variable qui est passée, jamais la valeur.

Daniel
0
cs_dragon
Messages postés
2336
Date d'inscription
samedi 14 juillet 2001
Statut
Membre
Dernière intervention
5 mai 2009
6
27 mai 2005 à 18:52
faux

byref c'est l'addresse mémoire de la variable qui est passé et byval est la valeur de la variable

donc byref passe une addresse et byval crée une nouvelle variable en mémoire et la passe à la fonction. En mémoire c'est 2 chose totallement différente qui est faite masi il est conseiller d'utiliser byval en tout temps pour éviter les bugs et byref quand on veut retourné plusieurs retour

par contre, un tableau est toujuors passé en référence et jamais en valeur, puisqu'un tableau est en fait un tableau d'addresse mémoire et non un tableau de valeur


-------------------------------------------------
Dragon alias aussi Waxime mais bon, pas le gout de refaire un nouveau profil lol
-------------------------------------------------
0
cs_Jack
Messages postés
14007
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
27 mai 2005 à 19:02
Salut
Ca sert à quoi de poster des sources/tutos si personne n'a le courage de faire une toute petite recherche sur le site ?
Ah lalala : http://www.vbfrance.com/code.aspx?ID=7081

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage. (Socrate)
0
Gobillot
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
33
27 mai 2005 à 19:11
comment faux !

c'est toujours l'adresse d'une variable qui est passée.
pour passer un tableau tu peux passer le premier élément.


Daniel
0
cs_dragon
Messages postés
2336
Date d'inscription
samedi 14 juillet 2001
Statut
Membre
Dernière intervention
5 mai 2009
6
27 mai 2005 à 19:46
ah oki ouin si tu considère que créé une valeur en mémoire et passer son addresse de la nouvelle valeur créé c'est une adresse mémoire ouin .... j'aime juste pas comment tu l'as dit c'est tout


-------------------------------------------------
Dragon alias aussi Waxime mais bon, pas le gout de refaire un nouveau profil lol
-------------------------------------------------
0
bidoch78
Messages postés
67
Date d'inscription
mercredi 27 février 2002
Statut
Membre
Dernière intervention
2 décembre 2005

30 mai 2005 à 10:58
De toute facon, quelque part une variable fait référence à un pointeur en mémoire, le faite de spécifier Byval ou Byref permet de connaitre au compilateur la maniere dont tu vas utiliser la variable, et c'est qui compte pour le développeur. Si tu as fais du c++ et que tu testes les passages par référence ou par copie d'un objet, en tracant le constructeur tu vois clairement que lors du passage par valeur, une nouvelle instance de l'objet est créée (et la clairement cela peut entrainer des pbs de performance), lorsque tu travailles avec une chaine de caractere et que tu la passes par ByVal le compilateur va réallouer en mémoire la chaine et ensuite la passer en parametre puis elle va etre détruite en sortie de la fonction (pour simplifier la chose), alors qu'avec ByRef c'est la meme chaine qui va etre passée.

Bidoch78
0
Gobillot
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
33
30 mai 2005 à 17:50
et non

pour une chaîne, avec Byref ou Byval, c'est toujours une copie.

je parle pour une procédure externe, Vb les transforme en ASCII

avant de détruire la copie, la chaîne est recopiée et transformée en Unicode.

Daniel
0
bidoch78
Messages postés
67
Date d'inscription
mercredi 27 février 2002
Statut
Membre
Dernière intervention
2 décembre 2005

31 mai 2005 à 10:28
J'avoue j'avais jamais remarqué ca (en faisant un petit test avec VarPtr()), c'est pas la meme adresse qui est retournée !!!!!!. Bizarre....

Bidoch78
0
Gobillot
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
33
31 mai 2005 à 11:11
hé oui pas aussi simple le ByVal et ByRef,

je ne sais pas si on peut encore parler de "valeur" et de "référence" ici,

en ce sens que ByRef renvoie un pointeur sur la chaîne, et que ByVal
renvoie la valeur contenu par ce pointeur qui est aussi une adresse,
donc une référence !


Daniel
0
cs_Jack
Messages postés
14007
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
1 juin 2005 à 19:15
lol Bidoch78
Je te rassure, il ne faut surtout pas raisonner en terme de vitesse, mais d'utilisation de la variable : ByVal fait une copie de la variable, alors que ByRef travaille avec la variable passée : Le résultat est profondemment différent !

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage. (Socrate)
0