保存通过引用传递的对象中的赋值

时间:2014-04-08 14:58:00

标签: vb.net pointers variable-assignment memento

我想确认扩展到我一直试图理解的一些事情。

我有两种情况:

场景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中的原始列表?

希望它有意义!谢谢!

1 个答案:

答案 0 :(得分:0)

将ClassY中的'myList'设置回原始版本不会改变'Main'方法中的'myList'。 让'RevertChanges'采用列表参数:

Public Sub RevertChanges(ByRef changedList As List(Of Double))
   myList = myOriginalList 
   changedList = myList
End Sub