下記検証ソースはaMain/ClsA/ClsBの3Moduleから構成されています
ClsAはClsBをSetでき、ClsA.ValでClsB.Valを呼び出しできます。
ClsA内にSetしたClsBのObjectを、ClsA.ObjNothigやClsA.Class_Terminate
で Nothingしてますが。
その後、ClsBを生成した側(aMain)で、ClsBの状態を確認すると
Nothingされてないと判定されます([02][03][04])。(想定外:通常のMain-Subの
関係だとNothingされている[05])
※まるでClsA内にあるClsBへの参照のみ解除しているような振る舞い
言語仕様なのでしょうか?
すいません適当なDocに辿り着けておらず,できれば
この挙動について言及されているサイトを教えて
もらえると助かります。
検証環境は 7.4.7.2(x64)です。
【以下検証ソースです】
----[Module:aMain]----
Option Explicit
Option Base 0
Option Compatible
Private Sub aMain
CompatibilityMode(True)
Dim wClsA as Object : wClsA = new_ClsA()
Dim wClsB as Object : wClsB = new_ClsB()
Set wClsA.Obj = wClsB
Msgbox “[00]ClsA.Val:” & wClsA.Val
wClsB.Val = 22222222
Msgbox “[01]ClsA.Val:” & wClsA.Val
Dim wStr as String
wClsA.ObjNothing
wStr = “[02]ClsA.ObjNothing : ClsA/ClsB”
wStr = wStr & vbCR & “ClsA[” & IIF( wClsA Is Nothing, “Nothing”, “Exist”)
wStr = wStr & vbCR & “ClsB[” & IIF( wClsB Is Nothing, “Nothing”, “Exist”)
MsgBox wStr
Msgbox “[03]ClsB.Val:” & wClsB.Val
Set wClsA = Nothing
wStr = “[04]ClsA = Nothing : ClsA/ClsB”
wStr = wStr & vbCR & “ClsA[” & IIF( wClsA Is Nothing, “Nothing”, “Exist”)
wStr = wStr & vbCR & “ClsB[” & IIF( wClsB Is Nothing, “Nothing”, “Exist”)
MsgBox wStr
Call aSub( wClsB)
wStr = “[05]Call aSub : ClsA/ClsB”
wStr = wStr & vbCR & “ClsA[” & IIF( wClsA Is Nothing, “Nothing”, “Exist”)
wStr = wStr & vbCR & “ClsB[” & IIF( wClsB Is Nothing, “Nothing”, “Exist”)
MsgBox wStr
End Sub
Public Function new_ClsA() as Object
Set new_ClsA = New ClsA
End Function
Public Function new_ClsB() as Object
Set new_ClsB = New ClsB
End Function
Private Sub aSub( aCls as Object)
Set aCls = Nothing
End Sub
----[Module:ClsA]----
Option Explicit
Option Base 0
Option Compatible
Option ClassModule
Private mObj as Object
Private Sub Class_Initialize()
End Sub
Private Sub Class_Terminate()
Set mObj = Nothing
End Sub
Public Property Set Obj ( aObj as Object )
Set mObj = aObj
End Property
Public Function Val() as Long
Val = mObj.Val
End Function
Public Sub ObjNothing()
Set mObj = Nothing
End Sub
----[Module:ClsB]----
Option Explicit
Option Base 0
Option Compatible
Option ClassModule
Private mVal as Long
Private Sub Class_Initialize()
mVal = 77777777
End Sub
Private Sub Class_Terminate()
End Sub
Public Property Let Val ( aVal as Long )
mVal = aVal
End Property
Public Property Get Val () as Long
Val = mVal
End Property