【发布时间】:2009-11-18 17:22:01
【问题描述】:
我在我的代码中“克隆”对象。例如:
objClone = objOriginal
我的问题是:
- VB.NET 1.1 中的赋值运算符是逐个成员地复制 objOriginal 到 objClone 还是 objClone 只是指向 objOriginal 引用的内存的引用?
【问题讨论】:
我在我的代码中“克隆”对象。例如:
objClone = objOriginal
我的问题是:
【问题讨论】:
如果类型是引用类型(即:类),则它是引用副本。如果是值类型(Structure),会逐个成员复制。
【讨论】:
您显示的代码会发生什么取决于objOriginal 是什么类型:
objClone 将引用与objOriginal 相同的实例
objClone将是一个新的实例,与objOriginal的内容相同
但请注意,如果它是一个值类型,其中任何成员都是引用类型,那么这些成员将引用与原始对象相同的实例(这称为 浅拷贝)。
例子:
Public Class Test
Public Number As Integer
End Class
Dim objOriginal As New Test()
objOriginal.Number = 42
Dim objClone As Test
objClone = objOriginal
在这种情况下,objClone 和 objOriginal 都将引用 Test 的同一个实例。
Public Structure Test
Public Number As Integer
End Class
Dim objOriginal As New Test()
objOriginal.Number = 42
Dim objClone As Test
objClone = objOriginal
在这种情况下,objClone 和 objOriginal 将是 Test 的不同实例,每个实例在 Number 字段中都有自己的 Integer 实例。
Public Class SomeValue
Public Number As Integer
End Class
Public Structure Test
Public Value As SomeValue
End Class
Dim objOriginal As New Test()
objOriginal.Value = New SomeValue()
objOriginal.Value.Number = 42
Dim objClone As Test
objClone = objOriginal
在这种情况下,objClone 和 objOriginal 将是 k 的两个不同实例,但两者都将通过其 Value 成员引用 SomeValue 的同一实例。
【讨论】:
我不确定 VB,但 C# 版本的赋值只做浅拷贝。 (编辑:对于引用类型)。
【讨论】: