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

Nic*_*vic 3 vb.net

将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
Run Code Online (Sandbox Code Playgroud)

Ste*_*art 6

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

ReadLocation1 = CType(rl.Clone(), ReadLocation)
Run Code Online (Sandbox Code Playgroud)

但是,在该克隆方法中,您需要创建一个新的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
Run Code Online (Sandbox Code Playgroud)