2009-01-26 6 views
31

Il y a un code dans notre projet qui ressemble un peu à ceci:Que fait le mot-clé Call dans VB6?

Private Sub Method1() 
    Call InnerMethod 
End Sub 

Private Sub Method2() 
    InnerMethod 
End Sub 

Private Sub InnerMethod() 
    '' stuff 
End Sub 

Quel est l'avantage de faire Method1 sur Method2?

Répondre

35

De l'MSDN:

Vous n'êtes pas obligé d'utiliser le mot-clé d'appel lors de l'appel d'une procédure. Cependant, si vous utilisez le mot-clé Call pour appeler une procédure qui requiert les arguments , la liste d'arguments doit être entre parenthèses. Si vous omettez le mot-clé Call, vous devez également omettre les parenthèses autour de la liste d'arguments. Si vous utilisez la syntaxe d'appel pour appeler toute fonction intrinsèque ou définie par l'utilisateur, la valeur de retour de la fonction est ignorée.

Par exemple:

Sub Proc1() 
    Debug.Print "Hello World" 
End Sub 

Sub Proc2(text As String) 
    Debug.Print "Hello " & text 
End Sub 

Dans la fenêtre immédiate, si vous entrez

Proc1 

puis imprime "Bonjour tout le monde". Si vous entrez

Call Proc1 

alors "Hello World" s'imprime. Si vous entrez

alors "Hello World" s'imprime. Si vous entrez

Call Proc2 "World" 

vous obtenez une erreur de compilation. Vous devez entrer

Call Proc2("World") 
2

Il n'y a pas de différence.

10

L'appel ne fait rien d'autre que d'appeler la méthode. Il s'agit d'un pendage de l'ancien temps de base lorsque toutes les lignes devaient commencer par un mot-clé. "Let" est un autre de ces mots-clés, qui a toujours été mis avant une affectation, mais n'est plus nécessaire.

La méthode 1 et la méthode 2 font exactement la même chose.

2

Voici un post qui décrit quand vous devez utiliser appel vs ne pas l'utiliser et quand aux parenthèses autour de vos paramètres.

Vous pouvez également en savoir plus sur call à partir de MSDN. Essentiellement, la principale différence est que lorsque vous utilisez call pour appeler une fonction, vous ne pouvez pas accéder à la valeur de retour.

4

J'ai trouvé une différence majeure à propos du mot-clé 'call' avec des fonctions ayant, ByRef Arguments (je l'ai trouvé dans l'éditeur MS-Access VBA). Si vous appelez la fonction sans le mot-clé 'Call', les artefacts ByRef ne seront pas définis pour le calle.Ex:

Private Function Test(Optional ByRef refArg As String) As Boolean  
    refArg = "Test" 
    Test = True 
End Function 

Si vous appelez la fonction sans le mot-clé Call comme

Dim a As String 
Test(a) 

a sera une chaîne vide, après l'appel retourne

Si vous appelez la fonction avec le Call mot-clé comme

Dim a As String 
Call Test(a) 

a contiendra la chaîne Test

L'explication détaillée fournie dans le lien suivant: http://blogs.msdn.com/b/ericlippert/archive/2003/09/15/52996.aspx

+5

Les deux ne sont pas équivalents. Dans le premier cas, entourer l'argument en parens le fait évaluer, et le résultat de l'évaluation est passé: en substance, vous passez une copie de "a", pas "a" lui-même. Ceci est rendu évident par l'analyseur. Lorsque vous entrez Test (a) et quittez la ligne, l'analyseur ajoute un espace, ce qui fait que Test (a) indique qu'il s'agit d'une expression; alors qu'avec Call Test (a), aucun espace ne sera ajouté - vous passez directement un "a". Voir la réponse de Patrick Cuff ci-dessus pour la référence doc. –

+0

En effet, et obtenir réellement le résultat (par exemple, 'MsgBox Test (a)') restaure l'équivalence. – Ant