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

标签 .net vb.net

很抱歉提出这样一个基本的范围界定问题,但我显然不了解有关范围界定的非常基本的内容。我有一个非常简单的类(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/

相关文章:

.net - 如何让 "Programming Entity Framework: DbContext"示例运行?

.net - 使用 MSBuild 时不构建私有(private)访问器

java - 如何在 Java 中使用 .Net dll

vb.net - 默认情况下参数如何传递给VB函数

VB.NET: "AddHandler"通过将 Handler 函数指定为变量

vb.net - 如何在 PDFsharp 中打开 PDF,其中 PDF 作为资源添加到项目中

C# Twilio 检索组合媒体

c# - 通过编程使用时,我的插入命令不会更改数据库

c# - WPF MVVM 与 Razor 页面 MVVM

c# - 具有读/写超时的命名管道 IPC 示例