问题
我有一个自定义类,声明时没有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
用例
- 第一次通过,没有添加,预计有0人
- 加上Mike警官,预计1人(Mike)
- 重置警察
- 预计1人(Joe)
- 加上汤姆警官,预计有两个人(乔,汤姆)
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在物业警察局内报警
- 单步模式
真的,我不知道为什么会发生这种情况,但简单的解决方案当然是避免这种情况。如果我了解更多,将更新此答案。