【问题标题】:Why is list.add() adding items to object AND source object as well?为什么 list.add() 也将项目添加到对象和源对象?
【发布时间】:2011-06-15 21:58:15
【问题描述】:

希望这足够简单。我需要能够在不修改全局 mylist 对象的情况下将元素添加到 mylist.testlist 的副本中。 (这似乎是通过下面的代码发生的。)

当我处理应该是一个完全独立的对象的 x 时,mylist 也会被修改。我怎样才能解决这个问题?我已经广泛使用列表,以前从未见过这种行为。我已经在 Win 7 Pro 32bit 上的 .NET 3.5 和 .NET 4.0 中测试并重现了该问题。

TIA!

源代码:

Public Class Form1
    Public mylist As New test

    Sub Main()
        Dim x As test = mylist
        For i As Integer = 0 To 10
            x.testlist.Add(False)
        Next

        MsgBox("x count: " + x.testlist.Count.ToString + vbCrLf + "mylist count: " + mylist.testlist.Count.ToString)

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Main()
    End Sub
End Class
Public Class test
    Public testlist As New List(Of Boolean)
    Public Sub New()
        testlist.Add(False)
    End Sub

End Class

【问题讨论】:

  • 为什么x 应该是一个与mylist 完全不同的对象?使用Dim x As test = mylist,您引用的是同一个对象。
  • 我认为 Dim x As test = mylist 创建了一个单独的对象,它是 mylist 的副本。不?这也是我用来解决这个问题的原型代码。这段代码的唯一目的是演示我遇到/感知的问题。
  • 我还需要能够创建 mylist 的副本,这样我就可以在不修改全局 mylist.testlist 的情况下修改 mylist.testlist 数据的副本。
  • 那么你是说Dim x As test = mylist 正在使x 成为指向mylist 的某种类型的指针引用?如果是这样,我该如何避免这种行为?

标签: vb.net list add


【解决方案1】:

正如 Tim Schmelter 在他的评论中指出的那样,你的问题是:

Dim x As test = mylist

x 通过它获得对mylist 的引用。这意味着两者xmylist)都指向test 的同一个实例。这就是为什么改变其中一个也会改变另一个。

要修复它,您可以将x 定义为test 的新实例,并将所有元素从mylist.testlist 复制到x.testlist

【讨论】:

  • 哎呀,我很害怕...感谢您的洞察力!珍惜时间!有没有我可以更改的编译选项来避免这种情况?
  • 不,这是标准和正常的行为。似乎您缺少一些基础知识。不能给你一个很好的参考来阅读这个。
  • 好吧,我完全有可能只是偶然发现了这一点。我通常不会这样编码,但其他人提出了这个问题,这似乎有点奇怪。感谢您的帮助!
  • 谢谢!欣赏链接,柯克。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多