このような基本的なスコープの質問は申し訳ありませんが、私は明らかに非常に基本的なスコープについて何かを理解していません。私は非常に単純なクラスを持っている:VB.Netでこのオブジェクト(配列リスト)の一覧を消去していますか?
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
私はそれが3つの値(1,2,3)を含む新しいtestListClassオブジェクトを渡すボタンを押すと、それから私はこれをインスタンス化するコードのブロックを持っています。 "theList.Add(新testListClass(localArrayList))" コールの後
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
、theListは1、私が期待するのと同じように3つの値(1,2,3)を含む "testListClass" オブジェクトが含まれています。以下は私が理解していないものです。次の呼び出しは次のとおりです。
localArrayList.Clear()
私はここに、デバッガでブレークポイントを設定し、私が何を参照してください。この行を実行した場合である:.classArrayListは今クリアされた
theList(0)。 clear()の前に3つの値(1,2,3)が含まれていたところで、ローカル定義のarrayListをクリアする呼び出しの後、 "theList(0)"の内容はクリアされました。何故ですか?私は、新しいコンストラクタのパラメータが値(ByVal)によって渡されるので、呼び出し元のコードのコンテナ値をローカルに変更すると、以前に別のクラスの別のメソッドに渡された値に影響しないと思います。私はここで何が分かりますか?
タイトルが残念です...「なぜ」ではなく、「何」であったはずです。これを再生した後、リストをクローンすると正しく動作するように見えます。したがって、 "theList.Add(new testListClass(localArrayList))"を "theList.Add(New testListClass(localArrayList.clone))"に変更すると、動作します。 – GregH
'List'の代わりに 'ArrayList'を使っている理由はありますか?それが 'List