修改每个循环内部的对象设置所有对象的属性,其值为最后一个

时间:2011-01-29 09:30:32

标签: vb.net loops

我有这样的程序。

Module Module1

Public Class Mstr
    Public Property Prop1 As String
    Public Property Prop2 As String
    Public Property Prop3 As String
    Public Property Prop4 As String

    Public Property lstDtlsA As List(Of DtlsA)
    Public Property DtlsB As DtlsB
End Class


Public Class DtlsA
    Public Property Prop1 As String
    Public Property Prop2 As Integer
    Public Property Prop3 As String
    Public Property Prop4 As Integer

    Public Property DtlsB As DtlsB
End Class

Public Class DtlsB
    Public Property Prop1 As String
    Public Property Prop2 As Integer
    Public Property Prop3 As String
    Public Property Prop4 As Integer
End Class

Private Sub Process(ByVal mstr As Mstr)
    Dim lstTemp As New List(Of DtlsA)

    For Each dtl In mstr.lstDtlsA
        'Do some processing
        PopulateDtlsBForDtlsA(mstr, dtl)
        lstTemp.Add(dtl)
    Next

    'Finally set the modified dtls list to mstr
    mstr.lstDtlsA = lstTemp
End Sub

Sub PopulateDtlsBForDtlsA(ByVal mstr As Mstr, ByVal dtl As DtlsA)
    Dim dtlB As New DtlsB

    dtlB = mstr.DtlsB
    dtlB.Prop1 = mstr.Prop1
    dtlB.Prop2 = dtl.Prop2
    dtlB.Prop4 = dtl.Prop4
    dtl.DtlsB = dtlB
End Sub

Sub Main()
    Dim mstr As New Mstr
    mstr.Prop1 = "Master Property 1"
    mstr.Prop2 = "Master Property 2"
    mstr.Prop3 = "Master Property 3"
    mstr.Prop4 = "Master Property 4"

    mstr.lstDtlsA = New List(Of DtlsA)
    Dim dtlA As DtlsA

    dtlA = New DtlsA
    dtlA.Prop1 = "Detail A Property 11"
    dtlA.Prop2 = 12
    dtlA.Prop3 = "Detail A Property 13"
    dtlA.Prop4 = 12
    mstr.lstDtlsA.Add(dtlA)

    dtlA = New DtlsA
    dtlA.Prop1 = "Detail A Property 21"
    dtlA.Prop2 = 22
    dtlA.Prop3 = "Detail A Property 23"
    dtlA.Prop4 = 24
    mstr.lstDtlsA.Add(dtlA)

    dtlA = New DtlsA
    dtlA.Prop1 = "Detail A Property 31"
    dtlA.Prop2 = 32
    dtlA.Prop3 = "Detail A Property 33"
    dtlA.Prop4 = 34
    mstr.lstDtlsA.Add(dtlA)

    Dim dtlB As New DtlsB

    dtlB.Prop1 = "Detail B Property 1 set by master"
    dtlB.Prop3 = "Detail B Property 3 set by master"
    mstr.DtlsB = dtlB

    Process(mstr)
End Sub

结束模块

但它没有像我期望的那样工作。您可以从Quickwatch while debugging

查看

所有三个DtlsA对象的DtlsB属性都具有上次迭代的值。请让我知道我在这里做错了什么,对这个概念的一些解释也会非常有帮助。感谢!!!

1 个答案:

答案 0 :(得分:0)

您正在重复使用和改变同一个对象:

dtlB = mstr.DtlsB

不使用现有对象,而是创建一个全新的对象或现有对象的克隆。