Tengo problemas con el uso de una lista en una propiedad de clase. Esta es mi clase:

Public Class SourceData
    Private _datafiles As New List(Of String)
    Public Property datafiles() As List(Of String)
        Get
            Return _datafiles
        End Get
        Set(value As List(Of String))
            _datafiles = value
        End Set
    End Property
End Class

Hasta aquí todo bien. Ahora quiero usarlo en mi programa:

Public filename_data As New List(Of SourceData)

Private Sub loadData()
    Dim currentSourceData As New SourceData

    currentSourceData.datafiles.Add("A")
    currentSourceData.datafiles.Add("B")
    currentSourceData.datafiles.Add("C")
    MsgBox(currentSourceData.datafiles.Count) 'Returns 3

    filename_data.Add(currentSourceData)
    MsgBox(filename_data(0).datafiles.Count) 'Returns 0
end sub

El primer cuadro de mensaje devolverá el número correcto de entradas de archivos de datos: 3 Sin embargo, el segundo cuadro de mensaje devolverá 0. De alguna manera, ¿la Lista de archivos de datos se perdió en el camino? No pude encontrar una solución a mi problema, no importa lo que intenté.

0
Alex 11 feb. 2015 a las 23:13

2 respuestas

La mejor respuesta

Estás agregando 'currentSourceData' a la lista tres veces:

filename_data.Add(currentSourceData)

'currentSourceData' es siempre la misma instancia; solo está agregando esto a la lista 3 veces, por lo que, por supuesto, obtendrá el mismo recuento para cada una de las instancias duplicadas. Y ese recuento será 3 ya que su ciclo 'for each' ocurre después de que se borró la lista de cadenas y luego se agregaron 3 cadenas.

Otra forma de ver esto es que su List (Of SourceData) tiene 3 entradas al final de 'loadData', y cada entrada apunta al mismo objeto. Aquí no se está copiando, que es lo que creo que esperabas.

Si desea que los objetos sean independientes después de agregarlos, debe agregar clones de 'currentSourceData' a la lista.

0
Dave Doknjas 11 feb. 2015 a las 22:16

Aquí está mi código final, gracias a sus sugerencias encontré mi problema:

    Public filename_data As New List(Of SourceData)

Private Sub loadData()
    Dim currentSourceData As New SourceData
    'first Item:
    currentSourceData.datafiles.Add("A")
    MsgBox(currentSourceData.datafiles.Count) 'Returns 1
    filename_data.Add(currentSourceData)
    currentSourceData = New SourceData
    'second Item:
    currentSourceData.datafiles.Add("A")
    currentSourceData.datafiles.Add("B")
    MsgBox(currentSourceData.datafiles.Count) 'Returns 2
    filename_data.Add(currentSourceData)
    currentSourceData = New SourceData
    'third Item:
    currentSourceData.datafiles.Add("A")
    currentSourceData.datafiles.Add("B")
    currentSourceData.datafiles.Add("C")
    MsgBox(currentSourceData.datafiles.Count) 'Returns 3
    filename_data.Add(currentSourceData)


    For Each x As SourceData In filename_data
        MessageBox.Show(x.datafiles.Count) 'Will Return 1.. 2.. 3
    Next
end sub
0
Alex 11 feb. 2015 a las 23:14