Модификация объектов внутри каждого цикла устанавливает свойства всех объектов со значениями последнего - PullRequest
0 голосов
/ 29 января 2011

У меня есть такая программа.

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

Свойства DtlsB всех трех объектов DtlsA имеют значения из последней итерации.Пожалуйста, дайте мне знать, что я делаю не так, здесь также было бы полезно немного пояснить концепцию.Спасибо !!!

1 Ответ

0 голосов
/ 29 января 2011

Вы повторно используете и изменяете здесь один и тот же объект:

dtlB = mstr.DtlsB

Вместо использования существующего объекта создайте совершенно новый объект или клон существующего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...