我想确认扩展到我一直试图理解的一些事情。
我有两种情况:
场景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中的原始列表?
希望它有意义!谢谢!
答案 0 :(得分:0)
将ClassY中的'myList'设置回原始版本不会改变'Main'方法中的'myList'。 让'RevertChanges'采用列表参数:
Public Sub RevertChanges(ByRef changedList As List(Of Double))
myList = myOriginalList
changedList = myList
End Sub