使用List(Of String)作为类属性

时间:2015-02-11 20:13:01

标签: vb.net list class properties

我在使用Class属性中的List时遇到问题。 这是我的班级:

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

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

2 个答案:

答案 0 :(得分:0)

您正在添加' currentSourceData'列表三次:

filename_data.Add(currentSourceData)

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

另一种看待这种情况的方法是你的List(Of SourceData)在' loadData'的末尾有3个条目。 - 并且每个条目指向同一个对象。这里没有复制,这是我的预期。

如果您想在添加后使对象独立,则需要添加' currentSourceData'的克隆。列表。

答案 1 :(得分:0)

这是我的最终代码,多亏了你的提示我发现了我的问题:

    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