ByVal ou byRef [Résolu]

cuq 345 Messages postés mardi 3 juin 2003Date d'inscription 21 mars 2008 Dernière intervention - 27 mai 2005 à 17:27 - Dernière réponse : cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention
- 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
Afficher la suite 

14 réponses

Meilleure réponse
Gobillot 3140 Messages postés vendredi 14 mai 2004Date d'inscription 31 mars 2015 Dernière intervention - 27 mai 2005 à 17:57
3
Merci
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

Merci Gobillot 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Meilleure réponse
bidoch78 67 Messages postés mercredi 27 février 2002Date d'inscription 2 décembre 2005 Dernière intervention - 31 mai 2005 à 11:53
3
Merci
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

Merci bidoch78 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

cs_drahcir 745 Messages postés mardi 30 novembre 2004Date d'inscription 15 septembre 2009 Dernière intervention - 27 mai 2005 à 17:30
0
Merci
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.

@+
bidoch78 67 Messages postés mercredi 27 février 2002Date d'inscription 2 décembre 2005 Dernière intervention - 27 mai 2005 à 18:02
0
Merci
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
Gobillot 3140 Messages postés vendredi 14 mai 2004Date d'inscription 31 mars 2015 Dernière intervention - 27 mai 2005 à 18:19
0
Merci
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
cs_dragon 2336 Messages postés samedi 14 juillet 2001Date d'inscription 5 mai 2009 Dernière intervention - 27 mai 2005 à 18:52
0
Merci
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
-------------------------------------------------
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 27 mai 2005 à 19:02
0
Merci
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)
Gobillot 3140 Messages postés vendredi 14 mai 2004Date d'inscription 31 mars 2015 Dernière intervention - 27 mai 2005 à 19:11
0
Merci
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
cs_dragon 2336 Messages postés samedi 14 juillet 2001Date d'inscription 5 mai 2009 Dernière intervention - 27 mai 2005 à 19:46
0
Merci
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
-------------------------------------------------
bidoch78 67 Messages postés mercredi 27 février 2002Date d'inscription 2 décembre 2005 Dernière intervention - 30 mai 2005 à 10:58
0
Merci
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
Gobillot 3140 Messages postés vendredi 14 mai 2004Date d'inscription 31 mars 2015 Dernière intervention - 30 mai 2005 à 17:50
0
Merci
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
bidoch78 67 Messages postés mercredi 27 février 2002Date d'inscription 2 décembre 2005 Dernière intervention - 31 mai 2005 à 10:28
0
Merci
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
Gobillot 3140 Messages postés vendredi 14 mai 2004Date d'inscription 31 mars 2015 Dernière intervention - 31 mai 2005 à 11:11
0
Merci
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
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 1 juin 2005 à 19:15
0
Merci
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)

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.