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
4

1 回答 1

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
于 2012-06-15T14:31:52.997 回答