将 VB.NET 列表对象复制到另一个列表对象

3

当我将VB.NET列表对象设置为另一个对象时,我遇到了问题。在下面的示例中,我创建了ReadLocations实例,然后创建了一个ReadLocation对象,在其中循环ReadLocations并将ReadLocation1设置为rl

问题在于,如果我将ReadLocation1更改为其他内容(例如assdfhsd),它也会更改ReadLocations索引。我真的很困惑,除非“=”符号表示引用而不是实际设置值,否则为什么会这样做。请帮忙解决,因为我是C#开发人员,但我要修改的程序是使用VB.NET编写的。

Dim ReadLocations As New List(Of Model.ReadLocation)
Dim rl1 As New Model.ReadLocation
rl1.LL = "a"
Dim rl2 As New Model.ReadLocation
rl2.LL = "b"
ReadLocations.Add(rl1)
ReadLocations.Add(rl2)

Dim ReadLocation11 As New Model.ReadLocation

For Each rl As Model.ReadLocation In ReadLocations
    ReadLocation11 = rl
Next

ReadLocation1是什么?ReadLocation11是打字错误吗? - sloth
你的意思是什么:“它会改变ReadLocations索引”? - sloth
ReadLocation1是一个类Model.ReadLocation的实例。我所说的ReadLocations索引是指,如果我更改ReadLocation1(不是打字错误),它会更改ReadLocations内相同对象的值。 - Nick Manojlovic
1个回答

6
如果ReadLocation是引用类型(即类),那么所有设置为该类对象实例的变量将永远是引用。 =操作符仅在操作引用类型时才会将新引用设置到对象上,它不会复制对象(除非对象是值类型)。C#中同样如此。要实现您想要的功能,唯一的方法是在将它们添加到第二个列表时克隆这些对象。不幸的是,.NET没有提供简单的自动克隆任何对象的方法。标准做法是在您的ReadLocation类中实现ICloneable接口,然后通过调用clone方法来对其进行克隆:
ReadLocation1 = CType(rl.Clone(), ReadLocation)

然而,在clone方法内部,你需要创建一个新的ReadLocation实例并手动设置它的所有属性,然后返回它。例如:

Public Class ReadLocation
    Implements ICloneable

    Public Function Clone() As Object Implements ICloneable.Clone
        Dim clone As New ReadLocation()
        clone.Property1 = Me.Property1
        clone.Property2 = Me.Property2
        Return clone
    End Function

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接