为什么List.Clear()也摆脱了类属性?

时间:2011-10-04 09:30:57

标签: vb.net class properties generic-list

我有以下课程:

    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 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个小时......呃

谢谢你的任何解释!

2 个答案:

答案 0 :(得分:2)

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

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

objId.IDlist = myList.ToList()

答案 1 :(得分:1)

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

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

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