2009-01-26 15 views
31

Es gibt einige Codes in unserem Projekt, das ein bisschen wie folgt aussieht:Was bewirkt das Call-Schlüsselwort in VB6?

Private Sub Method1() 
    Call InnerMethod 
End Sub 

Private Sub Method2() 
    InnerMethod 
End Sub 

Private Sub InnerMethod() 
    '' stuff 
End Sub 

Was ist der Vorteil von Method1 über Method2 tun?

Antwort

35

Vom MSDN:

Sie sind nicht erforderlich, um den Anruf Schlüsselwort zu verwenden, wenn eine Prozedur aufrufen. Wenn Sie jedoch das Aufrufschlüsselwort verwenden, um eine Prozedur aufzurufen, die Argumente erfordert, muss die Argumentliste in Klammern enthalten sein. Wenn Sie das Call-Schlüsselwort weglassen, müssen Sie auch die Klammern um Argumentliste weglassen. Wenn Sie eine Aufrufsyntax verwenden, um eine systeminterne oder benutzerdefinierte -Funktion aufzurufen, wird der Rückgabewert der Funktion verworfen.

Zum Beispiel:

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

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

In unmittelbarer Fenster, wenn Sie

eingeben
Proc1 

dann "Hallo Welt" druckt. Wenn Sie

Call Proc1 

eingeben, dann druckt "Hello World". Wenn Sie

Proc2 "World" 

eingeben, dann druckt "Hello World". Wenn Sie

Call Proc2 "World" 

eingeben, erhalten Sie einen Kompilierungsfehler. Sie müssten

eingeben
Call Proc2("World") 
2

Es gibt keinen Unterschied.

10

Call macht nichts besonderes, außer rufen Sie die Methode. Es ist ein Hang aus den alten Tagen von Basic, als alle Zeilen mit einem Schlüsselwort beginnen mussten. "Let" ist ein weiteres dieser Keywords, das immer vor einer Aufgabe gestellt wurde, aber nicht mehr benötigt wird.

Methode1 und Methode2 machen genau dasselbe.

2

Hier ist eine post, die beschreibt, wenn Sie Anruf verwenden müssen, nicht verwenden und wann zu Klammern um Ihre Parameter.

Sie können auch mehr über call von MSDN lesen. Im Wesentlichen besteht der Hauptunterschied darin, dass Sie beim Aufruf einer Funktion nicht auf den Rückgabewert zugreifen können.

4

Ich habe einen großen Unterschied gefunden über 'Call' Schlüsselwort mit Funktionen, die, ByRef Argumente haben (Ich habe dies in MS-Access VBA-Editor gefunden). Wenn Sie die Funktion ohne das Schlüsselwort 'Call' aufrufen, wird ByRef arguments nicht für die Calle gesetzt.Für Ex:

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

Wenn Sie die Funktion ohne Call Stichwort nennen wie

Dim a As String 
Test(a) 

a wird ein leerer String sein, nachdem der Anruf

kehrt Wenn Sie die Funktion mit der Call nennen Stichwort wie

Dim a As String 
Call Test(a) 

a wird die Zeichenfolge Test

die detaillierte Erklärung enthalten in der folgenden Verbindung bereitgestellt: http://blogs.msdn.com/b/ericlippert/archive/2003/09/15/52996.aspx

+5

Die beiden sind nicht äquivalent. Im ersten Fall bewirkt das Einschließen des Arguments in parens, dass es ausgewertet wird und das Ergebnis der Bewertung wird übergeben: Im Wesentlichen übergeben Sie eine Kopie von "a", nicht "a" selbst. Dies wird durch den Parser offensichtlich gemacht. Wenn Sie Test (a) eingeben und die Zeile belassen, fügt der Parser ein Leerzeichen hinzu, sodass Test (a) als Ausdruck angezeigt wird. während bei Call Test (a) kein Leerzeichen hinzugefügt wird - Sie übergeben "a" direkt. Siehe die Antwort von Patrick Cuff oben für die Doc-Referenz. –

+0

In der Tat, und das Ergebnis tatsächlich erhalten (zum Beispiel, MsgBox Test (a) ') stellt die Äquivalenz wieder her. – Ant

Verwandte Themen