ByVal ou byRef [Résolu]

Signaler
Messages postés
345
Date d'inscription
mardi 3 juin 2003
Statut
Membre
Dernière intervention
21 mars 2008
-
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
-
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

Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
27
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 123 internautes nous ont dit merci ce mois-ci

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

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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 123 internautes nous ont dit merci ce mois-ci

Messages postés
745
Date d'inscription
mardi 30 novembre 2004
Statut
Membre
Dernière intervention
15 septembre 2009
4
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.

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

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
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
27
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
Messages postés
2336
Date d'inscription
samedi 14 juillet 2001
Statut
Membre
Dernière intervention
5 mai 2009
5
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
-------------------------------------------------
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
70
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)
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
27
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
Messages postés
2336
Date d'inscription
samedi 14 juillet 2001
Statut
Membre
Dernière intervention
5 mai 2009
5
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
-------------------------------------------------
Messages postés
67
Date d'inscription
mercredi 27 février 2002
Statut
Membre
Dernière intervention
2 décembre 2005

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
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
27
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
Messages postés
67
Date d'inscription
mercredi 27 février 2002
Statut
Membre
Dernière intervention
2 décembre 2005

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
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
27
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
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
70
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)