我正在尝试从对象的ArrayList(.NET 1.1 Framework)中检索正确的值:
我有以下定义:
Public AlList As New ArrayList
Public Class ItemInfo
Public ItemNo As Int16
Public ItemType As String
Public Reports As Array
Public PDFs As Array
End Class
form_load事件代码包含:
Dim AnItemObj As New ItemInfo
然后是一个包含以下内容的循环:
AnItemObj.ItemNo = AFile.RecordId
AnItemObj.ItemType = temp
AlList.Add(AnItemObj)
所以我现在应该拥有这些对象的ArrayList,但是如果我尝试检索数据:
MsgBox(AlList(5).ItemNo)
我总是得到列表中最后一个值的ItemNo。
我错过了什么?
答案 0 :(得分:5)
输入以下代码:
Dim AnItemObj As New ItemInfo
内部将AnItemObj添加到列表的循环。
将引用类型添加到列表时,只添加引用,而不是值。
这意味着如果将相同实例的10倍添加到列表中,它将向列表添加相同引用的10倍。但是如果之后你仍然有对这个实例的引用,你可以修改它的属性,并且由于列表中的所有10个条目都指向内存中的相同引用,所有10个条目都将被修改。
答案 1 :(得分:1)
所以,你有:
Dim AnItemObj As New ItemInfo
For ...
AnItemObj.ItemNo = AFile.RecordId
AnItemObj.ItemType = temp
AlList.Add(AnItemObj)
Next
这里发生的事情是你创建一个单独的对象,在其上设置值,并在列表中添加对它的引用。然后,您正在更改ItemInfo并将对该项目的另一个引用添加到列表中
你需要在每个循环上构造一个新对象,因此松散:
Dim AnItemObj As ItemInfo
For ...
AnItemObj = New ItemInfo
AnItemObj.ItemNo = AFile.RecordId
AnItemObj.ItemType = temp
AlList.Add(AnItemObj)
Next
答案 2 :(得分:0)
您是否为循环的每个增量创建了一个新的iteminfo实例?
答案 3 :(得分:0)
我看不到你的完整循环代码,但我想原因是没有将AnItemObj设置为New ItemInfo对象。因此,您最终会修改同一个对象并再次将其添加到列表中(列表中的所有项目都指向同一个对象)。
AnItemObj = New ItemInfo()
AnItemObj.ItemNo = AFile.RecordId
AnItemObj.ItemType = temp
AlList.Add(AnItemObj)