7

我一直使用ByRef成功,直到现在。我需要一个函数来Double从类对象修改 a 。为了说明,请考虑以下程序。

Class1.cls:
Public d As Double
Sub Test()
    Dim c As Class1, d As Double
    Set c = New Class1

    c.d = 5
    d = 5

    ChangeVar c.d
    ChangeVar d

    Debug.Print c.d
    Debug.Print d
End Sub

Sub ChangeVar(ByRef d As Double)
    d = 10
End Sub

令我惊讶的是,上面的示例将输出

5
10

有人吗?

4

2 回答 2

7

在引擎盖下aClassInstance.publicVariable被封装为隐藏属性 get/let 对,因此传递ByRef是传递隐藏get属性返回值的地址,而不是在类中声明的底层变量。

您可以通过检查d类中 2 种形式的地址来测试这一点;他们会有所不同

(class_init)
debug.? " d address=" & VarPtr(d)
debug.? ".d address=" & VarPtr(me.d)
于 2012-05-14T16:36:31.420 回答
1

我自己也遇到了这个问题,它更干净的解决方法是将它变成一个函数

Sub Test()     
    Dim c As Class1, d As Double     
    Set c = New Class1      
    c.d = 5     
    d = 5      
    c.d = ChangeVar(c.d)     
    d = ChangeVar(d)     
    Debug.Print c.d     
    Debug.Print d 
End Sub  

Public function ChangeVar(d As Double)     
    ChangeVar = 10 
End Function
于 2012-10-03T22:02:08.760 回答