我想创建一个产品字典,其中 id 是关键,产品参数是包含产品信息的自定义类。看起来我正确存储了信息,但显然不是,因为我只能检索最后一条记录。我做错了什么?
Public Class ProductClass
Public id As Integer
Public name As String
Public details As String
End Class
Sub Test
Dim i As Integer
Dim singleProduct As New ProductClass
Dim testDb As New Dictionary(Of Integer, ProductClass)
For i = 1 To 3
singleProduct.id = i
singleProduct.name = "Product " & i
singleProduct.details = "blablabla"
testDb.Add(singleProduct.id, singleProduct)
Next i
For Each dbKey As Integer In testDb.Keys
Debug.Print(dbKey & " :: " & testDb(dbKey).name & vbCrLf)
Next
End Sub
调试输出:
1 :: Product 3
2 :: Product 3
3 :: Product 3
问题在于您只在循环之外创建了一个 singleProduct 实例。在循环内,您在每次传递时都会覆盖此实例属性,并每次都在映射中存储相同的实例。 “Integer”不是对象,因此每次都会复制映射键。因此,您最终将得到一个包含 3 个条目的映射,每个条目都指向相同的“singleProduct”。
解决办法很简单。将您在循环内创建“singleProduct”的行移动。这样,您将在地图中添加 3 个单独的实例。我不知道 VB.net 是否会这样做,但大多数语言都有“构造函数参数”的概念,这将通过强制您将属性直接传递给实例构造来帮助您避免此类错误,而不是手动设置它们现有实例。您应该尝试查看 VB 是否支持它并在这些情况下使用它。