【问题标题】:Why does List.Clear() also get rid of a class property?为什么 List.Clear() 也摆脱了类属性?
【发布时间】:2011-10-04 09:30:56
【问题描述】:

我有以下课程:

    Public Class ID
        Private sID as List(Of Integer)

        Public property IDlist as List(Of Integer)
            Get
                Return sID
            End Get
            Set(ByVal value as List(Of Integer)
                sID = value
            End Set
        End Property
    End Class

然后我会这样做:

    Dim objID as ID
    Dim myList as List(Of Integer)

    for i = 0 to 1
        objID = New ID
        MyList.add(1)
        Mylist.add(2)

        ID.IDlist = mylist
        mylist.clear
    Next

如果我在 mylist.clear 之前插入代码以检索 ID.IDlist 属性之一,则它对两次迭代都有效。但是,如果我尝试在 for 循环之后检索值,我什么也得不到。

我发现这段代码允许我在 for 循环之后获取两个 ID 对象的 ID.IDlist:

    Dim objID as ID
    Dim myList as List(Of Integer)

    for i = 0 to 1
        objID = New ID
        mylist = New List(Of Integer)

        MyList.add(1)
        Mylist.add(2)

        ID.IDlist = mylist
    Next

我可能会离开这里,但似乎 ID.IDlist 指向 mylist 的地址,因此当 mylist 被清除时,ID.Idlist 也是如此。似乎第二个代码块起作用的原因是因为我在内存中为每个 ID 对象创建了一个新列表,而 ID.IDlist 只是指向它......对吗?

谁能确认/解释一下?我在这种情况下花了大约 5 个小时.. ugh

谢谢你的解释!

【问题讨论】:

  • 你的假设是正确的。

标签: vb.net class properties generic-list


【解决方案1】:

是的,您正在传递一个引用类型,这意味着您正在创建指向堆栈中对象的指针的副本。

为了防止这种情况,您可以制作列表的浅表副本。在这种情况下,使用扩展方法 ToList() 会很容易。

objId.IDlist = myList.ToList()

【讨论】:

    【解决方案2】:

    当你这样做时:ID.IDlist = mylist

    ID.IDlist 和 mylist 都是完全相同的列表。如果你清除了一个,你也清除了另一个。

    另外,我认为这不会编译,因为 ID 是一个类而不是一个对象。

    【讨论】:

    • 哎呀,是的,这是一个错字。我输入它而不是复制/粘贴 - 在我的实际代码中我确实正确。谢谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 1970-01-01
    • 2023-02-05
    • 1970-01-01
    • 2021-08-10
    • 2018-01-26
    相关资源
    最近更新 更多