使用列表(字符串)作为 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
我在 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