比较来自世界各地的卖家的域名和 IT 服务价格

VB6 通过价值传输并通过链接

我努力弄清楚节目并通过链接到 VB6. 我充分了解面向对象的编程语言的这些概念,例如 .NET 和 Java /我明白那个 Java 没有 pass by reference/. 看看下面的代码:


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 我明白这一切都是真的,但它没有解释她身后的原因。
已邀请:

三叔

赞同来自:

这是经典的 gotcha 在 VB6. 它
http://msdn.microsoft.com/en-u ... .aspx
VB6 . 在下面的代码中 VB6 认为这个论点是

表达

/测试/, 而不是与变量的链接


TestFunction /Test/


要将链接传输到变量,尺寸缩小,或使用过时
http://msdn.microsoft.com/en-u ... .aspx
Call

/这需要括号/


TestFunction Test
Call TestFunction/Test/


VB6 允许您将表达式传输给参数
ByRef

, 即使该方法改变了它们。 例如,你可以写


TestFunction /Test + 2/


编译器创建临时副本并通过引用传输。 VB.Net
http://msdn.microsoft.com/en-u ... .aspx
.

您还可以强制编译器创建临时副本 TestFunction 采取两个这样的论点:


TestFunction /one/, /two/


你也可以获得临时副本
Call

, 如果您通过添加额外的不必要的配对来加倍括号:


Call TestFunction//Test//

二哥

赞同来自:

括号中任何表达的结论导致了这个表达首先在做其他事情之前计算出来的事实,

即使这个表达式只是一个变量

. 在您的情况下,然后将此表达式作为参数发送。

因此,您实际上通过引用传达了参数。 但是您发送的参数是表达式的结果,而不是原始变量。 这就是为什么源变量未更新。

要回复问题请先登录注册