Vba VB6按值传递和按引用传递

Vba VB6按值传递和按引用传递,vba,vbscript,vb6,Vba,Vbscript,Vb6,我正在努力理解VB6中的传递值和传递引用。我在面向对象编程语言(如.NET和Java)中完全理解这些概念(我意识到Java没有通过引用传递)。请查看下面的代码: Private Sub Form_Load() Dim Test As Integer Test = 1 TestFunction Test 'line 5 MsgBox (Test) End Sub Private Sub TestFunction(ByVal i As Integer) i = i + 1 End Su

我正在努力理解VB6中的传递值和传递引用。我在面向对象编程语言(如.NET和Java)中完全理解这些概念(我意识到Java没有通过引用传递)。请查看下面的代码:

Private Sub Form_Load()

Dim Test As Integer
Test = 1
TestFunction Test 'line 5
MsgBox (Test)

End Sub

Private Sub TestFunction(ByVal i As Integer)
    i = i + 1
End Sub
Private Sub Form_Load()

Dim Test As Integer
Test = 1
TestFunction Test 'line 5
MsgBox Test

End Sub

Private Sub TestFunction(ByRef i As Integer)
    i = i + 1
End Sub
当我在第5行的测试周围放上括号时,消息框会像我预期的那样打印1。现在看一下下面的代码:

Private Sub Form_Load()

Dim Test As Integer
Test = 1
TestFunction Test 'line 5
MsgBox (Test)

End Sub

Private Sub TestFunction(ByVal i As Integer)
    i = i + 1
End Sub
Private Sub Form_Load()

Dim Test As Integer
Test = 1
TestFunction Test 'line 5
MsgBox Test

End Sub

Private Sub TestFunction(ByRef i As Integer)
    i = i + 1
End Sub

消息框按我的预期打印2。但是,如果在第5行中添加括号,则消息框将打印1,这是我所不期望的。即使在被调用函数中定义的变量是ByRef,调用函数也可以按值传递。情况似乎并非如此,反之亦然,即,如果被调用函数的签名中包含一个定义为ByVal的变量,那么它将始终是ByVal(即使调用函数中的变量周围没有括号)。在VB6中,这背后的想法是什么?我意识到这是VB6中的一个基本问题,但它把我弄糊涂了。我已经阅读了MSDN文档,我意识到这一切都是正确的,但是它并没有解释其背后的原因。

这是VB6中的一个经典问题。它是。在下面的代码中,VB6将参数视为表达式(测试),而不是变量引用

TestFunction (Test)
为了传递对变量的引用,可以省略括号或使用遗留变量(需要括号)

VB6允许您将表达式传递给
ByRef
参数,即使该方法更改了它们。你会写字

TestFunction (Test + 2)
编译器创建一个临时副本并通过引用传递该副本。Net

如果TestFunction采用以下两个参数,您还可以让编译器创建临时副本:

TestFunction (one), (two)
如果您将括号加倍,并添加一对多余的非必需副本,则即使使用
Call
,您也可以获得临时副本:

Call TestFunction((Test))

将任何表达式括在括号内会导致在执行任何其他操作之前首先计算该表达式,即使该表达式只是一个变量。在您的例子中,该表达式的结果将作为参数传递


事实上,您是通过引用传递参数。但是您传递的参数是表达式的结果,而不是原始变量。这就是原始变量无法更新的原因

谢谢。这是有用的。调用函数的目的是什么?这是否意味着传递的变量永远不会被视为表达式?我对此感到惊讶,因为我以前从未真正想过这一点。另外,如果要传递的变量不止一个,那么我假设您不能包含表达式?我不确定这是一个“gotcha”,因为它是记录在案的故意行为。Call关键字是legacy,已弃用,可以追溯到早期的MS Basic。无论参数是否被视为表达式,
Call
关键字都没有意义。它只是使用括号作为传递参数的方式,因此一对括号具有不同的含义。但是参数周围的括号会产生一个表达式,就像没有
Call
关键字一样。@Bob我称之为gotcha,因为它是一个众所周知的语言陷阱,很难理解,而且容易陷阱新手。这就是我对gotcha的理解。米里亚姆-韦伯斯特字典:抓住了一个意想不到的,通常是令人不安的挑战,启示,或捕获。在这种情况下,意图和文档(我已经链接)还不足以阻止它成为一个陷阱。@Bob不,我不相信我的话可以证明任何东西都是陷阱。只有经常被误解的事情。我希望我能对语言提出一些友好的批评,而不是消极的批评(我喜欢VB!)。尽管我试图通过告诉学员,他们并非唯一一个发现这一困难的人来鼓励他们。这在教学中很重要。