在vb.net字典中使用自定义类

问题描述 投票:0回答:1

我想创建一个产品字典,其中 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
vb.net class oop associative-array
1个回答
0
投票

问题在于您只在循环之外创建了一个 singleProduct 实例。在循环内,您在每次传递时都会覆盖此实例属性,并每次都在映射中存储相同的实例。 “Integer”不是对象,因此每次都会复制映射键。因此,您最终将得到一个包含 3 个条目的映射,每个条目都指向相同的“singleProduct”。

解决办法很简单。将您在循环内创建“singleProduct”的行移动。这样,您将在地图中添加 3 个单独的实例。我不知道 VB.net 是否会这样做,但大多数语言都有“构造函数参数”的概念,这将通过强制您将属性直接传递给实例构造来帮助您避免此类错误,而不是手动设置它们现有实例。您应该尝试查看 VB 是否支持它并在这些情况下使用它。

© www.soinside.com 2019 - 2024. All rights reserved.