Почему List.Clear () также избавляется от свойства класса? - PullRequest
0 голосов
/ 04 октября 2011

У меня есть следующий класс:

    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

Если я вставлю код для извлечения одного из свойств ID.IDlist ДО mylist.clear, он отлично работает для обеих итераций. Однако, если я попытаюсь получить значения ПОСЛЕ цикла for, я ничего не получу.

Я обнаружил, что этот код позволяет мне получить ID.IDlist для обоих объектов ID после цикла for:

    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 ]

2 голосов
/ 04 октября 2011

Да, вы передаете ссылочный тип, что означает, что вы создаете копию указателя на объект в стеке.

Чтобы предотвратить это, вы можете сделать поверхностную копию списка. В этом случае это будет легко с помощью метода Extension ToList ().

objId.IDlist = myList.ToList()
1 голос
/ 04 октября 2011

Когда вы делаете: ID.IDlist = mylist

И ID.IDlist, и mylist - это один и тот же список. Если вы очистите одно, вы также очистите другое.

Кроме того, я не думаю, что это скомпилируется, поскольку ID - это класс, а не объект.

...