-1

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

我有两种情况:

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

希望这是有道理的!谢谢!

4

1 回答 1

0

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

Public Sub RevertChanges(ByRef changedList As List(Of Double))
   myList = myOriginalList 
   changedList = myList
End Sub
于 2014-04-08T15:37:59.893 回答