【问题标题】:Remove reference from List Of Objects in vb.net从 vb.net 中的对象列表中删除引用
【发布时间】:2016-03-24 14:21:54
【问题描述】:

我想将一个 List(Of Object) 的内容复制到另一个并修改一个值。有没有办法删除引用?

在代码示例中,当我期望“test1 test2”时,我得到了输出“test2 test2”。

Module Module1

Sub Main()
    Dim ListOfSample As New List(Of sample)
    Dim var1 As New sample
    var1.Name = "test"
    ListOfSample.Add(var1)
    ListOfSample.Add(var1)

    Dim NewListOfSample As New List(Of sample)

    NewListOfSample.AddRange(ListOfSample)
    NewListOfSample(1).Name = "test2"

    Console.Write(NewListOfSample(0).Name & " " & NewListOfSample(1).Name)
End Sub

End Module

Public Class sample
    Public Name As String
End Class

【问题讨论】:

  • 这可能会有所帮助,除非这是同样的问题:http://stackoverflow.com/a/78612/1565525
  • 这里的关键是你只有有一个sample对象,而且你在两个列表中都有两次。因此,您的所有列表条目都引用同一个对象,并且更改一个正在更改那个对象

标签: vb.net list reference


【解决方案1】:

由于您的列表是对象列表,因此当您执行添加范围时,您不会添加“副本”,而是将指针(引用)添加到原始列表中的相同对象。

您需要克隆第一个列表中的所有对象,然后将这些克隆添加到您的第二个列表中。当谈到克隆时,.NET 中有几种不同的方法。这是一篇关于获取对象的深层副本的帖子,它很好地解释了您的选择:Deep Copy of an Object

您可以在“示例”对象上创建一个克隆方法以返回其自身的新初始化副本,或者您可以使用我链接到的帖子中提到的一些序列化方法。

【讨论】:

  • 谢谢你,这对我帮助很大!
  • 谢谢,清除 AddRange 通过引用或实际克隆进行复制。
【解决方案2】:

NewListOfSample.AddRange(ListOfSample) 行中,您正在添加对新列表的引用。因此,无论您在新列表中进行的任何更改都会更新原始列表中的引用(它们都指向相同的对象)。您需要将 Sample 的新实例添加到第二个列表中,以使其包含独立项目。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-03
    • 2020-04-17
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    相关资源
    最近更新 更多