【问题标题】:Using a List(Of String) as a Class Property使用 List(Of String) 作为类属性
【发布时间】:2015-04-12 08:53:44
【问题描述】:

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

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。不知何故,数据文件列表在途中丢失了?无论我如何尝试,我都找不到解决问题的方法。

【问题讨论】:

  • 有些东西不在这里——你遗漏了一些东西,因为你不能在一个方法中拥有Public filename_data As New List(Of SourceData)。你能显示所有你的代码吗?
  • 另外,我已经运行了你的代码,两次都是“3”。
  • 这里相同 - 您确定您的实际代码中的“MsgBox(filename_data(0).datafiles.Count)”语句在您添加数据之后发生 A','B',&'C'?
  • filename_data.Count 返回什么?您确定索引 0 是您刚刚添加的项目吗?也许你应该做 MessageBox.Show(filename_data(filename_data.Count-1).datafiles.Count)
  • 这里没有错。其他事情正在发生。

标签: vb.net list class properties


【解决方案1】:

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

    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

【讨论】:

    【解决方案2】:

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

    filename_data.Add(currentSourceData)
    

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

    另一种看待这一点的方式是,您的 List(Of SourceData) 在“loadData”末尾有 3 个条目 - 每个条目都指向同一个对象。这里没有复制,我想这是你所期望的。

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

    【讨论】:

    • 谢谢你,戴夫!这似乎是正确的。但是,我正在尝试创建 currentSourceData 的克隆以添加到列表中半小时。你能描述一下如何做到这一点吗?
    • 我不确定克隆是否真的是您想要的 - 如果是,那么您的 SourceData 类将需要其中的一个方法来创建自身的克隆。 clone 方法需要将对象状态(即字段)复制到新实例并返回该新实例。
    • 嗯,我想我在这里完全搞错了。我现在头很痛,所以我最好休息一下,但这里是我想要做的简短描述:我正在循环浏览文件夹,即:For Each dri In diArr If File.Exists(...) Then ... currentSourceData.datafiles.add(FilePath) End If ... filename_data.Add(currentSourceData) ... Next dri 我在 for each 中添加了该类的其他属性。 . 下一个声明。我只想有一个文件夹名称列表,其中包含每个文件夹名称的文件列表(和其他信息)。
    • 我终于明白了!每次将 currentSourceData = New SourceData 添加到 SourceData 列表后,我都必须声明它!
    猜你喜欢
    • 2015-09-04
    • 1970-01-01
    • 2023-03-30
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    • 2019-04-11
    相关资源
    最近更新 更多