Collection verhält sich nicht wie erwartet

  • VB.NET
  • .NET (Standard) 1.0–2.1

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Collection verhält sich nicht wie erwartet

    Hallo,
    ich habe ein Verständnisproblem bezüglich der Funktionsweise von Collections. Ich habe beispielhaft folgendes programmiert:

    VB.NET-Quellcode

    1. Dim a As New Collection
    2. Dim b As New Collection
    3. a.Add("Montag")
    4. a.Add("Dienstag")
    5. a.Add("Mittwoch")
    6. a.Add("Donnerstag")
    7. a.Add("Freitag")
    8. a.Add("Samstag")
    9. a.Add("Sonntag")
    10. b = a ' lege ich eine Kopie der Collections von a an.
    11. ' In diesen Zeilen lösche ich Elemente der Collections a
    12. a.Remove(7)
    13. a.Remove(6)
    14. a.Remove(5)
    15. a.Remove(4)
    16. a.Remove(3)
    17. a.Remove(2)
    18. a = b ' Mit dieser Zeile möchte ich die Collections a in den Urzustand zurückversetzen, da ich ja eine Kopie mit der Collections b habe. Aber das funktioniert nicht.

    Wenn ich aus a ein Element lösche, wird es gleichzeitig in b gelöscht. Das hatte ich nicht erwartet. Warum ist das so ?

    Code-Tags eingefügt. ~Thunderbolt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()

    Wert- und Referenztypen
    Die Collection selbst ist ein Referenztyp.

    VB.NET-Quellcode

    1. a = New Collection 'a ist ein Zeiger und zeigt auf eine Collection
    2. b = New Collection 'b ist ein Zeiger und zeigt auf eine andere Collection
    3. 'Es gibt zwei Collections momentan
    4. b = a 'b zeigt nun auf die Collection auf die a zeigt.
    5. 'Es gibt nur noch eine Collection

    Stattdessen musst du einen Referenztyp explizit kopieren. Entweder durch Cloning oder im Falle einer Liste oder eines Arrays ist es ein bissle einfacher.

    VB.NET-Quellcode

    1. a = New List(Of String) 'a ist ein Zeiger und zeigt auf eine Liste an Strings
    2. b = New List(Of String) 'b ist ein Zeiger und zeigt auf eine andere Liste an Strings
    3. 'Es gibt zwei Listen momentan
    4. b = a.ToList 'b zeigt nun auf eine neue (dritte) Liste an Strings die diegleichen Elemente hat wie die Liste von a.
    5. 'Es gibt immernoch zwei Listen, jedoch ist eine nun eine andere

    Du siehst außerdem in beiden Fällen ist die ursprüngliche Initialisierung von b irrelevant. Diese Ursprungsliste wird beide Male verworfen.

    Dieser Beitrag wurde bereits 10 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Dextrenys schrieb:

    Es wäre sinnvoll, Methoden zur Überwachung von von Änderungen in der Collection zu implementieren
    Bei einer obsoleten VB6-Collection wird sicher keiner mehr was erweitern.
    Das was du willst, ist aber in einer ObservableCollection(Of T) umgesetzt.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --