将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
答案 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