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 ! ;)
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
=> 9/10 Comme le dis très bien Aroc00l, ce n'est qu'une explication...
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 ]==-
au fond c'est ByVal qui est "spécial" ByRef c'est le truc plus normal dison mais faut quand meme faire la nuance
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.