【发布时间】:2014-04-08 14:57:59
【问题描述】:
我想确认对我一直试图理解的一些事情的扩展。
我有两种情况:
场景 1: 我有一个列表存储在我班级的私有字段中,我制作了一份深层副本并将其存储在其他私有字段中。这样做之后,我对列表进行了一些更改,但我可以选择检索其原始状态。为此,我将原始列表的副本分配给修改后的列表:
Public Class ClassX
Private myList As List(Of Double)
Private myOriginalList As List(Of Double)
Public Sub New()
myList = New List(Of Double)
myOriginalList = ObjectCopier.Clone(myList)
End Sub
Private Sub Main()
ChangeMyList()
'myList has one element
RevertChanges()
'myList has zero elements
End Sub
Public Sub ChangeMyList()
Dim r As New Random
myList.Add(r.NextDouble)
End Sub
Public Sub RevertChanges()
myList = myOriginalList
End Sub
End Class
这样做,让一切如我所愿。
场景 2: 这个想法几乎相同,制作一个列表的深层副本以允许检索其原始状态。但是,在这种情况下,列表被传递给另一个对象,该对象对其进行深层复制,对其进行修改,并决定保存这些更改或恢复它们。通过这样做,我无法获得所需的行为,因为即使我进行分配“myList = myOriginalList”,列表也会更改。代码:
Public Class ClassX
Private myList As List(Of Double)
Private Sub Main()
Dim myList As New List(Of Double)
Dim c As New ClassY(myList)
c.ChangeList()
'myList has one element
c.RevertChanges()
'myList still has one element
End Sub
End Class
Public Class ClassY
Private myList As List(Of Double)
Private myOriginalList As List(Of Double)
Public Sub New(ByVal c As List(Of Double))
myList = c
myOriginalList = ObjectCopier.Clone(myList)
End Sub
Public Sub ChangeList()
Dim r As New Random
myList.Add(r.NextDouble)
End Sub
Public Sub RevertChanges()
myList = myOriginalList
End Sub
End Class
所以问题是……为什么?为什么我可以在第一种情况下以这种方式恢复更改,而在第二种情况下不能?为什么对作为引用传递给 ClassY 的列表所做的更改被保存,但分配没有传输到 ClassX 中的原始列表?
希望这是有道理的!谢谢!
【问题讨论】:
-
myList = myOriginalList不会复制或还原它,它只是让两个对象引用同一个列表。如果那是您在ObjectCopier中所做的,那么您没有制作副本,而是复制了对象引用 -
在 ObjectCopier 中,我通过复制对象的序列化和反序列化来进行深度复制,因此它实际上是一个不同的对象,没有对前一个对象的引用。谢谢。
-
ObjectCopier显然有问题,我们看不到该代码来判断您是否实际上返回了New列表(对于列表副本而言,序列化似乎很长的路要走)。另外,为什么 ClassX 不能继承 ClassY 而不是创建私有内部对象(不清楚 X 是否维护对 Y 的引用,如果那是真实的代码)? -
使用此代码,您无法再次还原。
-
嗨。这不是我要编写的真实代码,它是简化的,但我试图理解的行为出现在这个简化的示例中。克隆器很像这个:stackoverflow.com/a/78612/2651069。当然,我知道复制列表的更好方法,这只是为了简化目的!
标签: vb.net pointers variable-assignment memento