使用列表(字符串)作为 Class 属性

Using a List(Of String) as a Class Property

我在 Class 属性 中使用列表时遇到问题。 这是我的 Class:

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

到目前为止,还不错。现在我想在我的程序中使用它:

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

第一个消息框将 return 正确的数据文件条目数:3 但是,第二个消息框将 return 0。不知何故,数据文件列表在途中丢失了?无论我如何尝试,我都找不到解决问题的方法。

您将 'currentSourceData' 添加到列表中三次:

filename_data.Add(currentSourceData)

'currentSourceData' 始终是同一个实例 - 您只是将其添加到列表中 3 次,因此您当然会为每个重复实例获得相同的计数。该计数将为 3,因为您的 'for each' 循环发生在清除字符串列表然后添加 3 个字符串之后。

另一种看待这个问题的方法是,您的 List(Of SourceData) 在 'loadData' 末尾有 3 个条目 - 每个条目都指向同一个对象。这里没有进行复制,这正是您所期望的。

如果希望对象添加后独立,则需要将'currentSourceData'的克隆添加到列表中。

这是我的最终代码,感谢您的提示,我找到了我的问题:

    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