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

将VB.NET列表对象复制到另一个列表对象,vb.net,Vb.net,将VB.NET列表对象设置为其他对象时出现问题。在下面的例子中 我在ReadLocations上创建一个实例,然后创建一个ReadLocation的对象,然后在ReadLocations中循环,并将ReadLocation1设置为等于rl Dim ReadLocations As New List(Of Model.ReadLocation) Dim rl1 As New Model.ReadLocation rl1.LL = "a" Dim rl2 As New Model.ReadLocat

将VB.NET列表对象设置为其他对象时出现问题。在下面的例子中 我在
ReadLocations
上创建一个实例,然后创建一个
ReadLocation
的对象,然后在
ReadLocations
中循环,并将
ReadLocation1
设置为等于
rl

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
更改为其他内容(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

如果
ReadLocation
是引用类型(类),则设置为该类对象实例的所有变量将始终是引用。
=
运算符仅在对象对引用类型进行操作时才设置对对象的新引用。它永远不会克隆对象(除非它是值类型)。C#也是如此。要执行您想要执行的操作,唯一的方法是在将对象添加到第二个列表时克隆它们。不幸的是,.NET没有提供一个简单的自动克隆任何对象的方法。实现这一点的标准方法是在ReadLocation类中实现IClonable接口。然后,您可以通过调用clone方法来克隆它:

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 = CType(rl.Clone(), ReadLocation)
但是,在该克隆方法中,您需要创建ReadLocation的新实例,手动设置其所有属性,然后返回它。例如:

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
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

什么是
ReadLocation1
ReadLocation11
是打字错误吗?你说的“它将更改ReadLocations索引”是什么意思?ReadLocation1是一个Model.ReadLocation,它是一个类。我所说的ReadLocations索引的意思是,如果我更改了ReadLocation1(不是打字错误),它会更改ReadLocations中相同对象的值。