2

所以我在这里使用了一些代码,我使用一个字典来填充两个不同的字典,这些字典作为自定义类中的属性保存。我这样做是为了提高效率。

注意:我通过为要设置的每个属性使用字典来解决此问题,但这并不太有效。

所以大致这是我的代码:

for iKey = 1 to class.maxnumber ' 8
    dTempDict.add iKey, cdbl(24)   ' enforce to 24 for calcs later
next iKey

Set class.dict1 = dTempDict ' commit to class.dict1

dTempDict.removeall 'wipe temp dictionary

for iKey = 1 to class.maxnumber ' 8
    dTempDict.add iKey, "word"   ' something other than 24 to test
next iKey

Set class.dict2 = dTempDict

所以上面的工作正常。然后我尝试循环并打印 class.dict1 的键没有问题。然后,当我尝试将值分配给预先声明的 dbl 时,我遇到了麻烦。然后我在不同的子传递类byref中循环遍历每个键:

dim dTempDict as scripting.dictionary
Set dTempDict = class.dict1 
for each iKey in dTempDict
 msgbox typename(dTempDict.Item(iKey))
next iKey

这带来了结果......“字符串”......令人困惑。然后我将我的值持有者更改为一个字符串并且它起作用了。我已经检查了类中的访问器,并且它们没有循环回错误的字典属性,因此看起来即使我将它们分配到第二个甚至执行了 .removeall,我的第二个字典的值也会填充到第一个字典中。

有任何想法吗?

如上所述,对 class.dict1 和 class.dict2 使用不同的临时字典,它们被正确分配,但这仍然令人困惑。

4

2 回答 2

0

一般来说,我不喜欢在课堂上放字典,除非是为了开其他课。我不知道你的情况,所以无法评论。但无论 '24' 是什么,您可能会认为它应该是它自己的对象,并且您的类将包含另一个集合类。顺便说一句,我为此目的使用集合而不是字典。然后你访问像

clsDepartment.Employees.Count

代替

clsDepartment.mydict(1)

无论如何,对于你所拥有的,你应该在类中填充字典而不是创建临时字典。如果你的班级看起来像这样

Private mdcTwentyFour As Scripting.Dictionary
Private mdcNotTwentyFour As Scripting.Dictionary

Public Property Get TwentyFour() As Scripting.Dictionary
    Set TwentyFour = mdcTwentyFour
End Property

Public Property Get NotTwentyFour() As Scripting.Dictionary
    Set NotTwentyFour = mdcNotTwentyFour
End Property

Public Property Get MaxNumber() As Long
    MaxNumber = 8
End Property

Private Sub Class_Initialize()

    Set mdcTwentyFour = New Scripting.Dictionary
    Set mdcNotTwentyFour = New Scripting.Dictionary

End Sub

那么你的潜艇可能看起来像这样

Sub FillClassDicts()

    Dim clsClass As CClass
    Dim i As Long

    Set clsClass = New CClass

    For i = 1 To clsClass.MaxNumber
        clsClass.TwentyFour.Add i, 24
        clsClass.NotTwentyFour.Add i, "word"
    Next i

    Debug.Print clsClass.TwentyFour.Count, clsClass.NotTwentyFour.Count
    Debug.Print TypeName(clsClass.TwentyFour(1)), TypeName(clsClass.NotTwentyFour(5))

End Sub
于 2013-02-28T22:14:49.470 回答
0

当你这样做...

Set class.dict1 = dTempDict 
dTempDict.removeall 
'...
Set class.dict2 = dTempDict

... 然后两者都dict1指向dict2同一个 Dictionary 对象 ( dTempDict)。

将一个对象变量分配给另一个对象变量不会创建该对象的副本,而只会导致指向同一对象的附加“指针”。

您应该创建一个新的 Dictionary 而不是重新使用同一个来分配给dict2.

于 2013-02-28T19:37:14.690 回答