Я создавал новый объект в цикле и добавлял этот объект в коллекцию; но когда я читал коллекцию позже, она всегда была полностью заполнена последним объектом, который я добавил. У меня есть два пути решения этой проблемы, но я просто не понимаю, почему моя первоначальная реализация была неправильной.
Оригинал:
Dim oItem As Variant
Dim sOutput As String
Dim i As Integer
Dim oCollection As New Collection
For i = 0 To 10
Dim oMatch As New clsMatch
oMatch.setLineNumber i
oCollection.Add oMatch
Next
For Each oItem In oCollection
sOutput = sOutput & "[" & oItem.lineNumber & "]"
Next
MsgBox sOutput
В результате каждый номер строки был равен 10; Я явно не создавал новые объекты, а вместо этого использовал один и тот же каждый раз в цикле, несмотря на то, что объявление было внутри цикла.
Итак, я добавил Set oMatch = Nothing
непосредственно перед строкой Next
, и это устранило проблему, теперь это было от 0 до 10. Итак, если старый объект был явно уничтожен, тогда он хотел создать новый? Я бы подумал, что следующая итерация цикла приведет к тому, что все, что объявлено внутри цикла, будет уничтожено из-за области видимости?
Любопытно, я попробовал другой способ объявления нового объекта: Dim oMatch As clsMatch: Set oMatch = New clsMatch
. Это также приводит к 0-10.
Может кто-нибудь объяснить мне, почему первая реализация была неправильной?