这是我的第一篇文章,我一直在寻找,但找不到我的问题的答案,因为我甚至不确定它的正确术语,我不完全确定如何解释它,但我会尝试一个很小的例子,它本质上是我实际代码的简化版本:
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_B
,myObject_B
就像指向myObject_A
的指针一样。
我想要的是让myObject_B
与myObject_A
具有相同的值,但不要将两者联系在一起。自从升级到 Visual Studio Express 2012 for Windows Desktop 以来,我才开始注意到这种行为。在以前的版本中,我不认为这是我的变量表现的方式。
我怀疑我做错了什么,我也怀疑 VS 2012 for Desktop 中的某些内容已被更改。如果需要,我非常愿意分享我的实际代码,如果以上内容足以弄明白我搞砸了,我只是不想粘贴一堆东西。
真诚的,Brian
更新
感谢您的克隆链接和编码示例。它帮助我理解正在谈论的内容,并在我有更多时间时给我一些进一步阅读的内容。这对我来说是全新的,我很欣赏这方面的知识。然而,它引出了我的下一个问题,即我实际上正在制作myCustomClass的列表。是否可以在整个列表上实现克隆,或者我是否需要创建一个New myCustomClass对象列表,然后遍历每个列表项并在每个列表项上使用克隆方法?
Dim myList as List(Of myCustomClass)
我不确定如何为myCustomClass列表实现克隆。
答案 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()
答案 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
这不会将它们链接在一起,而是将myValue
从myObject_A
放入myObject_B
。
这是一件很简单的事情,但是,如果您有复杂的对象,我建议您在班级中实施Clone()
方法。
有关Cloning的更多信息。
更新: 我相信您更新的问题已经回复here