我似乎得到指针行为而不是复制对象的值?

时间:2014-03-20 04:00:47

标签: vb.net pointers visual-studio-2012 copy

这是我的第一篇文章,我一直在寻找,但找不到我的问题的答案,因为我甚至不确定它的正确术语,我不完全确定如何解释它,但我会尝试一个很小的例子,它本质上是我实际代码的简化版本:

Public Class myCustomClass
  Public myValue as String
  Public Sub New()
    With Me
      .myValue = String.Empty
    End With
  End Sub
End Class

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
  Dim myObject_A As New myCustomClass
  myObject_A.myValue = "Sample String"

  Dim myObject_B As New myCustomClass
  myObject_B = myObject_A

  myObject_B.myValue = "New Sample String"
End Sub

我遇到的问题是,当我将myObject_B.myValue的值更改为"New Sample String"时,对myObject_A.myValue进行了相同的更改,就好像不是复制myObject_A中的值一样1}}到myObject_BmyObject_B就像指向myObject_A的指针一样。

我想要的是让myObject_BmyObject_A具有相同的值,但不要将两者联系在一起。自从升级到 Visual Studio Express 2012 for Windows Desktop 以来,我才开始注意到这种行为。在以前的版本中,我不认为这是我的变量表现的方式。

我怀疑我做错了什么,我也怀疑 VS 2012 for Desktop 中的某些内容已被更改。如果需要,我非常愿意分享我的实际代码,如果以上内容足以弄明白我搞砸了,我只是不想粘贴一堆东西。

真诚的,Brian

更新

感谢您的克隆链接和编码示例。它帮助我理解正在谈论的内容,并在我有更多时间时给我一些进一步阅读的内容。这对我来说是全新的,我很欣赏这方面的知识。然而,它引出了我的下一个问题,即我实际上正在制作myCustomClass的列表。是否可以在整个列表上实现克隆,或者我是否需要创建一个New myCustomClass对象列表,然后遍历每个列表项并在每个列表项上使用克隆方法?

Dim myList as List(Of myCustomClass)

我不确定如何为myCustomClass列表实现克隆。

3 个答案:

答案 0 :(得分:1)

在这种情况下,myClass是一个Class实例,并且具有类似语义的指针。在两个实例之间进行分配只会使它们引用同一个对象,而不会创建独立的副本。如果您想拥有价值行为,请将myClass改为Structure而不是Class

答案 1 :(得分:1)

Clone

中添加myCustomClass方法
Public Class myCustomClass
    Public myValue as String
    Public Sub New()
        With Me
           .myValue = String.Empty
        End With
    End Sub

    Public Function Clone() As myCustomClass
        Return DirectCast(Me.MemberwiseClone, myCustomClass)
    End Function
End Class

并指定你的myObject_B ......

myObject_B = myObject_A.Clone()

参考:Object.MemberwiseClone method

答案 2 :(得分:1)

  

我想要的是使myObject_B与myObject_A具有相同的值,但不能将两者链接在一起。

实现这一目标的最简单方法是:

Dim myObject_A As New myCustomClass
Dim myObject_B As New myCustomClass
myObject_A.myValue = "Sample String"
myObject_B.myValue = myObject_A.myValue

这不会将它们链接在一起,而是将myValuemyObject_A放入myObject_B。 这是一件很简单的事情,但是,如果您有复杂的对象,我建议您在班级中实施Clone()方法。

有关Cloning的更多信息。

更新: 我相信您更新的问题已经回复here