gpt4 book ai didi

.net - VB.Net 中被清除的对象列表(arrayLists)是什么?

转载 作者:行者123 更新时间:2023-12-02 17:52:18 25 4
gpt4 key购买 nike

很抱歉提出这样一个基本的范围界定问题,但我显然不了解有关范围界定的非常基本的内容。我有一个非常简单的类(class):

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

然后,当我按下按钮并将包含三个值 (1,2,3) 的新 testListClass 对象传递给它时,我有一个代码块实例化它。

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.Add(New testListClass(localArrayList))”调用之后,theList 包含一个“testListClass”对象,该对象包含三个值 (1,2,3),正如我所期望的那样。以下是我不明白的内容。下一个调用是:

localArrayList.Clear()  

如果我在调试器中设置断点并执行此行,我看到的是:

theList(0).classArrayList 现已被清除。在clear()之前它包含三个值(1,2,3),在调用清除本地定义的arrayList之后,“theList(0)”的内容现在已被清除。这是为什么?我认为,由于 New 构造函数参数是按值 (ByVal) 传递的,因此在调用代码中本地更改容器值不会对先前传递给不同类中的另一个方法的值产生任何影响。我在这里缺少什么明显的原则?

最佳答案

它是按值传递的,但 ArrayList(像所有类一样)是引用类型。所以你是按值传递引用。 .NET 永远不会为您复制对象,除非对象本身提供了一种方法来执行此操作。

在这种情况下,您可能需要使用 ArrayList.Clone() 方法。

关于.net - VB.Net 中被清除的对象列表(arrayLists)是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6670215/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com