List(Of T) 使用中遇到的奇怪问题

x287634334 2016-08-30 04:05:39
1、定义一个类TEntry。
2、定义一个类TOrder。
    Private Class TOrder
Dim _fdate As DateTime
Dim _custID As Integer
Dim _salerID As Integer
Public Property FDate As DateTime
Get
Return _fdate
End Get
Set(value As DateTime)
_fdate = value
End Set
End Property
Public Property CustID As Integer
Get
Return _custID
End Get
Set(value As Integer)
_custID = value
End Set
End Property
Public Property SalerID As Integer
Get
Return _salerID
End Get
Set(value As Integer)
_salerID = value
End Set
End Property
Property Entries As New List(Of TEntry)
End Class

其中定义了属性Entries是List(Of TEntry)。
3、给TOrder赋值。
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Try
Dim o As TOrder = New TOrder
Dim en As TEntry = New TEntry
With o
.FDate = #8/31/2016#
.CustID = 10985
.SalerID = 60338
With en
.Index = 1
.EntryID = 109
.ItemID = 277
.Price = 65
.Qty = 10
.Amount = .Price * .Qty
.Note = "分录1,玉米"
End With
.Entries.Add(en)
With en
.Index = 2
.EntryID = 110
.ItemID = 295
.Price = 55
.Qty = 10
.Amount = .Price * .Qty
.Note = "分录2,大豆"
End With
.Entries.Add(en)
End With
Dim jString As String = JsonConvert.SerializeObject(o, Formatting.Indented)
RichTextBox1.AppendText(jString)
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub

按常理来说,Entries(0).Note应该是“分录1,玉米”,Entries(1).Note应该是“分录2,大豆”。
但是实际运行结果却全部都是大豆。
大家看结果:
{
"FDate": "\/Date(1472572800000+0800)\/",
"CustID": 10985,
"SalerID": 60338,
"Entries": [
{
"Index": 2,
"EntryID": 110,
"ItemID": 295,
"Qty": 10.0,
"Price": 55.0,
"Amount": 550.0,
"Note": "分录2,大豆"
},
{
"Index": 2,
"EntryID": 110,
"ItemID": 295,
"Qty": 10.0,
"Price": 55.0,
"Amount": 550.0,
"Note": "分录2,大豆"
}
]
}


不知道是怎么回事,因为一开始我使用For循环给en赋值,无论循环几次,最终结果都是所有记录都变成了最后一条的值。后来就改成这样一条一条的赋值,还是所有记录都变成最后一次所赋的值。

请大家帮忙指点指点,到底是哪里写错了。只有65分,全部发出去,再次多谢!
...全文
287 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Poopaye 2016-08-30
  • 打赏
  • 举报
回复
那你要new2个TEntry出来啊 TEntry是class,不是struct 从头到尾只有1个TEntry
  • 打赏
  • 举报
回复
引用(副本),不管你的en对象包含的数据有多大,那都只占一个引用(与指针数据宽度相等),32位系统中也就4字节
  • 打赏
  • 举报
回复
这主要是对象是基于引用的,而集合.Add(en)实际上也只是添加一个引用(复本)而已 然Add()了两次,但这两个引用完全相同 查一下堆栈模型的相关资料

16,549

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧