2012-06-15 237 views
3

我在将VB.NET列表对象设置为另一个时遇到问题。在下面的示例中,我在ReadLocations上创建一个实例,然后创建一个对象ReadLocation,然后我通过ReadLocations循环并设置ReadLocation1等于rl将VB.NET列表对象复制到另一个列表对象

会发生什么,如果我然后去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

什么是“ReadLocation1”? 'ReadLocation11'是一个错字吗? – sloth

+0

你的意思是:'它会改变ReadLocations索引'? – sloth

+0

ReadLocation1是一个Model.ReadLocation,它是一个类。我的意思是ReadLocations索引是如果我更改ReadLocation1(不是拼写错误),它将更改ReadLocations中同一对象的值。 –

回答

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

真棒,工作。非常感谢。 –

相关问题