VB6传值和传引用

VB6传值和传引用

问题描述:

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

I am struggling to understand pass by value and pass by reference in VB6. I understand these concepts fully in Object Oriented programming languages like .NET and Java (I realise that Java doesn't have pass by reference). Have a look at the code below:

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 行的 Test 周围加上括号时,消息框会按照我的预期打印 1.现在看看下面的代码:

When I put brackets around Test on line 5, then the message box prints 1 as I would expect. Now have a look at the code below:

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 文档,我意识到这一切都是真的,但它并没有解释其背后的原因.

The message box prints 2 as I would expect. However, if you add brackets to line 5 then the message box prints 1 as I would not expect. It appears that the calling function can pass by value even if the variable defined in the called function is ByRef. It appears not to be the case vice versa, i.e. if the called function has a signature with a variable defined as ByVal then it will always be ByVal (even if there are no brackets around the variable in the calling function). What is the thinking behind this in VB6? I realize that this is a basic question in VB6 but it has confused me. I have read the MSDN documentation and I realize that this is all true, however it does not explain the reasoning behind it.

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

This is a classic gotcha in VB6. It is explained in the VB6 manual. In this code below, VB6 treats the argument as an expression (Test) rather than a variable reference

TestFunction (Test)

为了传递对变量的引用,请省略括号或使用旧的 Call 语句(需要括号)

In order to pass a reference to the variable either omit the brackets or use the legacy Call statement (which requires brackets)

TestFunction Test
Call TestFunction(Test)

VB6 允许您将表达式传递给 ByRef 参数,即使方法更改了它们.比如你可以写

VB6 allows you to pass expressions to ByRef arguments even if the method changes them. Eg you can write

TestFunction (Test + 2)

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

The compiler creates a temporary copy and passes that by reference. VB.Net uses brackets in a similar way.

如果 TestFunction 接受两个这样的参数,您也可以让编译器创建临时副本:

You can also get the compiler to create temporary copies if TestFunction takes two arguments like this:

TestFunction (one), (two)

如果您将括号加倍,添加一个额外的不必要的对,即使使用 Call 也可以获得临时副本:

And you can get temporary copies even with Call if you double your brackets, adding an extra unecessary pair:

Call TestFunction((Test))