2010-12-07 13 views
4

Est-il considéré comme une mauvaise pratique (VB.NET ou n'importe quelle langue) de coder une fonction avec les paramètres ByVal et ByRef utilisés dans ma fonction getFile ci-dessous?Mauvaise pratique pour passer les paramètres ByRef et ByVal dans la même routine?

Function getFile(ByVal channel As Integer, _ 
       ByRef Filename As String, _ 
       ByRef Filesize As String) As Integer 
... 
End Function 

... 
Dim status As Integer 
Dim filename As String 
Dim filesize As Integer 

For channel In 1 To 16 
    status = getFile(channel, filename, filesize) 
    ... 
Next channel 
+3

Je peux voir où ce mécanisme peut être utile, mais finalement, la sortie de la méthode devient encombrée: Renvoie un entier et (parfois) un nom de fichier/taille de fichier. Je voudrais qu'il renvoie une structure simple avec les trois types d'informations. – Assaf

Répondre

6

J'essaie généralement d'éviter ByRef tous ensemble, il finit souvent par être laid et confus. Le fait que vous mélangez ByVal et ByRef n'affecte pas la lisibilité tout simplement avoir tout ByRef IMHO. Par exemple, si je n'ai besoin que du nom de fichier, je devrais toujours transmettre une variable de taille de fichier, ce qui, je pense, le rend un peu plus laid. Et lors de la lecture du code, il peut être facile de manquer qu'un paramètre puisse être modifié. Comme Assaf le dit aussi dans son commentaire, j'essaierais plutôt de contourner le problème en demandant à la méthode de retourner une sorte de structure pouvant contenir toutes les données de retour. et si elle échouait, je lancerais une exception plutôt que de renvoyer le statut (en supposant que le statut soit une sorte d'erreur).

+1

D'accord. Utilisez byref et byval si nécessaire et approprié et vous serez en or. La plupart des paramètres sont à sens unique, passés, donc ils DEVRAIENT être byval. mais dans certaines circonstances, vous devez être en mesure de modifier un paramètre passé. Pas super commun, mais c'est pour ça que tu as Byref. – DarinH

+2

Je devrais ajouter, bien que si une fonction a besoin de retourner une valeur, il est généralement préférable de faire en sorte que la fonction retourne la valeur et non un paramètre byref. – DarinH

+2

et si une fonction doit renvoyer plusieurs valeurs, vous devez probablement créer une classe ou une structure spécifique à cette fin. – DarinH