我有以下课程:
Public Class ID
Private sID as List(Of Integer)
Public property IDlist as List(Of Integer)
Get
Return sID
End Get
Set(ByVal value as List(Of Integer)
sID = value
End Set
End Property
End Class
然后我做了:
Dim objID as ID
Dim myList as List(Of Integer)
for i = 0 to 1
objID = New ID
MyList.add(1)
Mylist.add(2)
ID.IDlist = mylist
mylist.clear
Next
如果我插入代码以在mylist.clear之前检索其中一个ID.IDlist属性,则它适用于两次迭代。但是,如果我尝试在for循环之后检索值,我什么也得不到。
我发现这段代码允许我在for for循环后得到两个ID对象的ID.IDlist:
Dim objID as ID
Dim myList as List(Of Integer)
for i = 0 to 1
objID = New ID
mylist = New List(Of Integer)
MyList.add(1)
Mylist.add(2)
ID.IDlist = mylist
Next
我可能会离开这里,但它几乎看起来像ID.IDlist指向mylist的地址,因此当mylist被清除时,ID.Idlist也是如此。似乎第二个代码块工作的原因是因为我在内存中为每个ID对象创建一个新列表,ID.IDlist只是指向它......是吗?
任何人都可以确认/解释吗?我在这种情况下花了5个小时......呃
谢谢你的任何解释!
答案 0 :(得分:2)
是的,您正在传递引用类型,这意味着您正在创建指向堆栈中对象的指针的副本。
为了防止这种情况,您可以制作列表的浅表副本。在这种情况下,使用Extension方法ToList()将很容易。
objId.IDlist = myList.ToList()
答案 1 :(得分:1)
当你这样做时:ID.IDlist = mylist
ID.IDlist和mylist都是完全相同的列表。如果你清除了一个,你也清除另一个。
另外,我不认为这会编译,因为ID是一个类而不是一个对象。