Petites précisions sur le passage de paramètres à une fonction, sub ou propriété

Soyez le premier à donner votre avis sur cette source.

Snippet vu 8 339 fois - Téléchargée 43 fois

Contenu du snippet

Bonjour à tous !

Je constate en épeluchant les sources de ce site que vous oubliez trop souvent, quand vous présentez des fonctions, de définir un passage de paramètre correctement construit.
Ce bref tutorial à pour but de vous montrer ce dernier, optimisé, et ceci dans le but de vous éviter à la longue, notament lors de cas de fonctions récursives, les exceptions ou autres violations d'accès.

NOTE: Il n'est nullement exhaustif, il ne traite notament pas des paramètres de type 'Optional' ou 'ParamArray'.

1er rappel :

- Bien définir la portée de la fonction/sub/prop. En effet, une portée 'Private' sera interne à un module, une form, une classe... Il ne sera donc pas accéssible à partir des autres module de l'application mais sera plus rapide et moins gourmant en ressources.
Tandis qu'une 'Public' sera visible par tous les autres modules de l'appli mais sera un plus gros consommateur de ressource du fait de sont implémentation multiples. De +, attention au doublement de nom de fonction quand il y a trop de 'Public'...

2eme rappel :

- Le paramètres doit être typé dans 95% des cas, c'est très important !! Evitez ainsi tous variant dans les paramètres, sauf si VRAIMENT vous ne pouvez pas définir exactement le type de donnée à passer ET/OU dans le cas d'un paramètre de type 'Optional'

3eme rappel :

- Précisez impérativement le type de passage, c'est à dire soit par référence, soit par valeur, je détail les deux cas :
1) ByRef (Par référence) : C'est la valeur par défaut, c'est à dire que si vous ne spécifiez de type de passage, c'est celle-ci qui est utilisée. C'est la plus ouple, elle est en lecture/écriture, c'est à dire que si vous modifier dans la fonction appellé le paramètre 'ByRef', celui-ci sera également modifié dans la fonction appellante, il s'agit en fait d'une adresse en mémoire.
Ex: Private Sub MaFonction(ByRef strParam As String)
strParam = "toto"
End Sub

Private Sub MaFonction_2()
Dim strBuffer As String

strBuffer = "titi"
Call MaFonction(strBuffer)
Debug.Print strBuffer ' strBuffer contient maintenant "toto"
End Sub

2) ByVal (par valeur) : Là, c'est autre chose, la valeur passé en paramètre est dupliqué en mémoire et utilisable UNIQUEMENT dans le périmètre de la fonction, c'est à dire que si vous modifier le paramètre passé, il sera perdu poour toujours à la sortie de la fonction (dès que l'exécution croise un Exit Function ou End Function)

Ex: Private Sub MaFonction(ByVal strParam As String)
strParam = "toto"
End Sub

Private Sub MaFonction_2()
Dim strBuffer As String

strBuffer = "titi"
Call MaFonction(strBuffer)
Debug.Print strBuffer ' strBuffer contient toujours "titi"
End Sub

- Avantages et inconvénients des deux :
  • ByRef permet la modification des paramètres ou le retour de paramètres nombreux, mais si elle modifie un paramètres qu'elle ne devais pas modifier, c'est le bug assuré dans la fonction appellante ! ;)
  • ByVal permet de travaillé dans son propre environnement sans se soucier des fonctions appellantes, il est isolé avec ses paramètres mais par contre consomme plus de mémoire.


- Pour une bonne utilisation de l'un ou de l'autre, il vous faut définir très exactement à quoi va servir le paramètre passé, est-ce qu'il va être réutilisé...

Conclusion :


Voila. J'espère que ce tutorial vous sera utile, car il est bon de temps en temps de revenir au source ! ;)

A voir également

Ajouter un commentaire

Commentaires

cs_piwy
Messages postés
27
Date d'inscription
mardi 6 janvier 2004
Statut
Membre
Dernière intervention
2 février 2006

Salut a toi oh grand spécialiste de la fonction :)

Je cherche mais en vain, le moyen d'intégrer une description des paramètres de mes fonctions.
Par exemple : je créer une DLL avec une fonction
public function get_toto(v_idtoto,v_value_toto) as string

Je souhaite, que quand un utilisateur externe utilise ma fonction il est directement a l'écran grace la l'interface visual studio les descriptif des paramètres, un truc du genre :

get_toto( v_idtoto, v_value_toto )
get_toto : fonction retournant toto
paramètres :
v_idtoto : code relatif a toto
v_value_toto : toto

Ceci est possible je pense, car dans les fonctions de base de visual basic.net quand on tape un nom de fonction il nous affiche cette aide.
Malheureusement je ne trouve rien, a moins que cela ne soit possible que dans une DLL VC++

Si tu connais la réponse je te remercie d'avance
mone et pock
Messages postés
14
Date d'inscription
lundi 29 décembre 2003
Statut
Membre
Dernière intervention
3 janvier 2004

C'est un bon tavail, court mais essentiel, continu!
=> 9/10 Comme le dis très bien Aroc00l, ce n'est qu'une explication...
cs_Zeroc00l
Messages postés
370
Date d'inscription
lundi 1 avril 2002
Statut
Membre
Dernière intervention
11 février 2010

En bref Byref agit comme un si on envoyait le pointeur de la variable désignée ( mais ca c'est plus du c++ )
Bonne idée de mettre cette source, mais perso je le savais avant ( j'ai le MSDN et ca m'avait intrigué )
Je recommande a tout le monde d'utiliser des byref, il est vrai que c'ts plus rapide et parmet de changer plus de valeur sans trop de ligne de code.

9/10 (chui peut etre vache mais c'est une explication on peut retrouve ailleur)

-={[ ZeroCool ]==-
cs_ProgrammeurFou
Messages postés
7
Date d'inscription
vendredi 26 juillet 2002
Statut
Membre
Dernière intervention
28 juillet 2002

Ok je pige ByVal c'est pour que la procedure ne change pas la valeur, donc par exemple pour simplement prendre la valeur de celle-ci

au fond c'est ByVal qui est "spécial" ByRef c'est le truc plus normal dison mais faut quand meme faire la nuance
cs_Jack
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
64
Oui, c'est sympa, d'autant que je n'avais jamais réussis à faire le vrai distingo en ByRef et ByVal (je me faisais pas chier : ByVal partout) : Si j'ai bien compris, ByRef peut donc aussi servir de variable pour renvoyer une donnée. Ca peut être pratique.
Merci de ces infos.
Jack

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.