Entschuldigen Sie, dass ich eine so grundlegende Frage zum Scoping stelle, aber ich verstehe offensichtlich etwas sehr Grundlegendes zum Scoping nicht. Ich habe eine sehr einfache Klasse:
Public Class testListClass
' This just contains a single list that is set by a property or the constructor
Private classArrayList As New ArrayList()
Public Sub New(ByVal theList As ArrayList)
classArrayList = theList
End Sub
End Class
Dann habe ich einen Codeblock, der diese instanziiert, wenn ich eine Taste drücken, die ein neues testListClass-Objekt mit drei Werten (1, 2, 3).
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
' Lets see if changing the arrayList results in all of the testListClass items being changed
Dim theList As New List(Of testListClass)
Dim localArrayList As New ArrayList()
localArrayList.Add(1)
localArrayList.Add(2)
localArrayList.Add(3)
theList.Add(New testListClass(localArrayList))
' This results in theList.classArrayList being cleared. Why since the parameter
' to the constructor is passed by value?
localArrayList.Clear()
localArrayList.Add(10)
localArrayList.Add(20)
theList.Add(New testListClass(localArrayList))
End Sub
Nach dem Aufruf "theList.Add(New testListClass(localArrayList))" enthält theList ein "testListClass"-Objekt, das drei Werte (1,2,3) enthält, so wie ich es erwarten würde. Das Folgende ist das, was ich nicht verstehe. Der nächste Aufruf ist:
localArrayList.Clear()
Wenn ich hier im Debugger einen Haltepunkt setze und diese Zeile ausführe, sehe ich folgendes:
theList(0).classArrayList wurde jetzt gelöscht. Während sie vor clear() drei Werte (1,2,3) enthielt, wurde nach dem Aufruf zum Löschen des lokal definierten ArrayList der Inhalt von "theList(0)" nun gelöscht. Warum ist das so? Ich würde denken, da der New-Konstruktor-Parameter als Wert (ByVal) übergeben wird, dass eine lokale Änderung eines Containerwertes im aufrufenden Code keine Auswirkungen auf die Werte hat, die zuvor an eine andere Methode in einer anderen Klasse übergeben wurden. Welches offensichtliche Prinzip übersehe ich hier?