VB6通过值和通过引用传递VB6通过值和通过引用传递(VB6 pass by value and p

2019-05-13 15:01发布

我努力理解按值传递和引用传递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

当我把括号试验第5行,然后在消息框中打印1,因为我期望的那样。 现在来看看下面的代码:

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文档,我意识到,这是所有真正的,但是它并不能解释其背后的原因。

Answer 1:

这是在VB6经典的疑难杂症。 这是在VB6手册中的说明 。 在下面这个代码,VB6对待参数作为表达 (测试),而不是可变基准

TestFunction (Test)

为了参考传递给变量要么省略托架或使用传统Call陈述 (要求括号)

TestFunction Test
Call TestFunction(Test)

VB6允许你传递表达式ByRef参数,即使该方法改变它们。 例如,你可以写

TestFunction (Test + 2)

编译器会创建一个临时副本并传递通过引用。 VB.Net 使用括号以类似的方式 。

你也可以让编译器创建临时副本,如果TestFunction需要两个参数是这样的:

TestFunction (one), (two)

你可以得到临时副本,即使Call如果您双击您的支架,增加额外的不必要的对:

Call TestFunction((Test))


Answer 2:

圆括号内的任何表达导致该表达式在做任何事情之前先进行计算, 即使那表情是只有一个变量 。 在你的情况下,表达式的结果作为一个参数然后传递。

所以,你实际上是通过引用传递参数。 但你传递的参数是表达式的结果,而不是原来的变量。 这就是为什么原来的变量没有更新。



文章来源: VB6 pass by value and pass by reference
标签: vb6