vba - 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 Sub

当我在第 5 行的 Test 周围加上括号时,消息框会按照我的预期打印 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 文档,我意识到这一切都是真的,但是它并没有解释其背后的原因。

最佳答案

这是 VB6 中的一个经典问题。是explained in the VB6 manual .在下面的这段代码中,VB6 将参数视为表达式 (Test) 而不是变量引用

TestFunction (Test)

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

VB6 允许您将表达式传递给 ByRef参数,即使方法改变了它们。例如你可以写
TestFunction (Test + 2)

编译器创建一个临时副本并通过引用传递它。 VB.Net uses brackets in a similar way .

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

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

关于vba - VB6传值和传引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10262186/

相关文章:

class - 在 Excel VBA 中使用类处理多个范围

excel - 通过不同和特定的工作表循环代码

VBScript,冒号的用途?

excel - 只知道一定数量的字符时替换一串文本

vba - 访问当前页眉中的形状

c++ - Windows 脚本宿主在关闭创建的窗口时终止

asp.net - 使用 asp.net (VB) 从 MySQL 中选择、更新、插入和删除的脚本?

c# - 在不了解领域知识的情况下逆向工程 VB6 代码的最佳实践方法

vba - 一次多重替换 vb6

com - 运行时的 "Method ' ~' of object ' ~' failed"是什么意思?