Call关键字在VB6中有什么作用?

Ant*_*Ant 33 vb6 syntax vba

我们的项目中有一些代码看起来像这样:

Private Sub Method1()
    Call InnerMethod
End Sub

Private Sub Method2()
    InnerMethod
End Sub

Private Sub InnerMethod()
    '' stuff
End Sub
Run Code Online (Sandbox Code Playgroud)

Method2优于Method2的优势是什么?

Pat*_*uff 37

来自MSDN:

调用过程时,不需要使用Call关键字.但是,如果使用Call关键字调用需要参数的过程,则必须将参数列表括在括号中.如果省略Call关键字,则还必须省略argumentlist周围的括号.如果使用Call语法调用任何内部函数或用户定义函数,则会丢弃函数的返回值.

例如:

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

Sub Proc2(text As String)
    Debug.Print "Hello " & text
End Sub
Run Code Online (Sandbox Code Playgroud)

在即时窗口中,如果您输入

Proc1
Run Code Online (Sandbox Code Playgroud)

然后打印"Hello World".如果你输入

Call Proc1
Run Code Online (Sandbox Code Playgroud)

然后打印"Hello World".如果你输入

Proc2 "World"
Run Code Online (Sandbox Code Playgroud)

然后打印"Hello World".如果你输入

Call Proc2 "World" 
Run Code Online (Sandbox Code Playgroud)

你得到一个编译错误.你必须输入

Call Proc2("World")
Run Code Online (Sandbox Code Playgroud)


Mar*_*own 11

除了调用方法之外,调用没有什么特别之处.当所有行都必须以关键字开头时,它是从Basic的旧时代开始的."让"是这些关键字中的另一个,它总是放在作业之前,但不再需要.

Method1和Method2完全相同.


小智 5

我发现'call'关键字的主要区别在于具有ByRef Arguments的函数(我在MS-Access VBA编辑器中找到了这个).如果您在没有"Call"关键字的情况下调用该函数,则不会为calle设置ByRef aruments.对于Ex:

Private Function Test(Optional ByRef refArg As String) As Boolean    
    refArg = "Test"
    Test = True
End Function
Run Code Online (Sandbox Code Playgroud)

如果你调用没有Call关键字的函数

Dim a As String
Test(a)
Run Code Online (Sandbox Code Playgroud)

a 在调用返回后将是一个空字符串

如果您使用Call关键字like 调用该函数

Dim a As String
Call Test(a)
Run Code Online (Sandbox Code Playgroud)

a 将包含字符串 Test

详细说明见以下链接:http: //blogs.msdn.com/b/ericlippert/archive/2003/09/15/52996.aspx

  • 这两者并不相同.在第一种情况下,将参数括在parens中会导致它被评估,并且评估的结果通过:实质上,你传递的是"a"的副本,而不是"a"本身.解析器使这一点变得明显.当您输入Test(a)并离开该行时,解析器将添加一个空格,使其成为Test(a)以指示它是一个表达式; 而使用呼叫测试(a)将不会添加空格 - 您直接传递"a".请参阅以上Patrick Cuff的答案,以获取文档参考. (5认同)