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

时间:2012-06-15 14:23:57

标签: 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

1 个答案:

答案 0 :(得分:6)

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

ReadLocation1 = CType(rl.Clone(), ReadLocation)

但是,在该克隆方法中,您需要创建一个新的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