7

今まで、私はいつもByRefうまく使っていました。Doubleクラスオブジェクトからを変更する関数が必要です。説明のために、次のプログラムについて考えてみます。

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 に答える