VBA自定义类的行为与新建Dim类似



问题

我有一个自定义类,声明时没有New,表现得像是New。为什么?如何防止这种情况发生?我做错了什么?

在注释为"问题在这里"的代码中,pPolice将在检查时被实例化,就好像它是用类顶部的New声明的一样。这意味着pPolice从来都不是Nothing,所以If块从来没有被输入,pPolice也从来没有按照我的意愿实例化。

这段代码是一个简化的模型来说明这个问题。

代码

自定义类clsPeople模拟集合(在实践中是强类型的)。

Private pPeople as Collection
Private Sub Class_Initialize()
    Set pPeople = New Collection
End Sub
Public Sub Add(Name as String)
    pPeople.Add Name
End Sub
Public Property Get Count() as Integer
    Count = pPeople.Count
End Property
' Other collection-like functions here...

自定义类clsCivilServants有不同的人。

Private pPolice as clsPeople
'Private pFire as clsPeople ' Listed to show how the class might work
Private Sub Class_Initialize()
    Set pPolice = New clsPeople
End Sub
Public Sub ResetPolice()
    Set pPolice = Nothing
End Sub
Public Property Get Police() as clsPeople
    If pPolice is Nothing Then               ' <---------- Problem Here
        Set pPolice = New clsPeople
        pPolice.Add "Officer Joe" ' Example to show that init worked
    End If
    Set Police = pPolice
End Property

用例

  1. 第一次通过,没有添加,预计有0人
  2. 加上Mike警官,预计1人(Mike)
  3. 重置警察
  4. 预计1人(Joe)
  5. 加上汤姆警官,预计有两个人(乔,汤姆)

Dim Springfield as clsCivilServants
Set Springfield = New clsCivilServants
' Step 1
'  look at pPolice: Declared, 0 people
' Step 2
Springfield.Police.Add "Officer Mike"
'  look at pPolice: Declared, 1 person
' Step 3
Springfield.ResetPolice
'  look at pPolice: Nothing, N/A
' Step 4
Debug.Print Springfield.Police.Count
'  observing Police causes declaration of pPolice
'  look at pPolice: Declared, 1 person
' Step 5
Springfield.Police.Add "Officer Tom"
'  look at pPolice: Declared, 2 people

该问题似乎只在某些调试情况下才会发生。

  • "VBA监视"窗格中列出了Springfield.Police
  • 财产警察内部停止执行代码
  • ResetPolice在物业警察局内报警
  • 单步模式

真的,我不知道为什么会发生这种情况,但简单的解决方案当然是避免这种情况。如果我了解更多,将更新此答案。

最新更新