我的VB.NET程序中有一个List
结构,我循环遍历它们,并更改列表中对象的值,如下所示
Dim retvals As List(Of SomeStruct) = parser.RetrieveData(new_path)
For i As Integer = 0 To retvals.Count - 1 Step 1
dim temp as SomeStruct = retvals(i)
temp.A = GetValueForA()
temp.B = GetValueForB()
Next
当我在这个循环之后查看我的结构列表时,没有任何值被覆盖。为什么?我以为我的列表中有引用,所以如果我将引用A更改为结构,那么引用B到同一结构应该看到更改?
我错过了什么?
答案 0 :(得分:2)
结构是值类型,而类是引用类型。如果您要使用SomeClass而不是SomeStruct,则此代码可以按预期工作。
在使用Class的场景中,retvals将是一个指向类对象的指针列表。 “dim temp as ...”会创建指针的副本,并将temp.A设置为某些内容会更改指针指向的对象。因此,当代码完成时,retval中的指针仍指向现在已更改的同一对象。 但是,在使用结构时,不存储指针。 retvals只是结构中存储的值的列表。 “dim temp as ...”创建了整个结构的副本。您可以通过更改temp.A来修改此结构,但原始结构永远不会更改,因为您只修改了它的副本。
答案 1 :(得分:0)
我意识到问题所在,.NET中的Structure
是值类型,这意味着内容将复制到{{1} }。因此,更改List
变量不会更改temp
我使用List
来修复它,这是一种引用类型。