我可以请有一定的帮助执行对象的深层副本。
这里是我的代码:
Option Explicit On
Option Strict On
<Serializable> Public Class [Class]
Private _Name As String
Private _ListOfFields As New List(Of Field)
Public Property Name As String
Get
Return _Name
End Get
Set(value As String)
_Name = value
End Set
End Property
Public Property ListOfFields As List(Of Field)
Get
Return _ListOfFields
End Get
Set(value As List(Of Field))
_ListOfFields = value
End Set
End Property
Public Function Clone() As [Class]
Return DirectCast(Me.MemberwiseClone, [Class])
End Function
End Class
现场是我自己写的,以及一类。
我需要做什么修改的克隆()函数返回一个深拷贝?
(顺便说一句,我可能会说出比“类”其他类的东西)。
如果你想手工做这一切,你需要遵循类似步骤:
- 确保您的Field类还实现了一个深拷贝
Clone()
方法。 如果你还没有这样做了,那么这可能会涉及其Clone()
方法创建类型的新对象Field
,然后根据当前对象的填充它的各个属性。 如果您的Field
类有其他的类/复杂类型(例如,你自己创建的类)的属性那么他们也应该实现Clone()
你应该调用Clone()
他们来创造新的深层副本 - 在你
Clone()
为类方法,你能创建一个类型的新对象[等级],例如,通过调用其构造 - 在设置
Name
的新对象的属性设置为Name
的当前对象的属性 - 创建一个新的
List(Of Field)
,我们称之为为listA的例子的缘故 - 遍历当前列表,并指定每个列表项的listA的克隆。 例如:
For Each item in _ListOfFields
listA.Add(item.Clone())
End
- 之后,你可以在你的新列表(listA的)分配给你在创建的对象
Clone()
方法
还有一个另外的(可能更好)通过手的办法,是在描述VB.NET 这里 。
如果你想欺骗一下,然后你可以只序列化现有的对象,然后将其反序列化到像技术的新对象这里
我会说那么连载反序列化技术是“最简单”的一个。
您可以通过调用这个辅助函数创建的任何类的克隆:
Function DeepClone(Of T)(ByRef orig As T) As T
' Don't serialize a null object, simply return the default for that object
If (Object.ReferenceEquals(orig, Nothing)) Then Return Nothing
Dim formatter As New BinaryFormatter()
Dim stream As New MemoryStream()
formatter.Serialize(stream, orig)
stream.Seek(0, SeekOrigin.Begin)
Return CType(formatter.Deserialize(stream), T)
End Function
这是通过从你的类序列化的所有信息变成一台便携式对象,然后以断绝任何引用指针改写它。
注意 :在类的通过,它公开作为属性必须被标记的任何其它类<Serializable()>
为了使用BinaryFormatter.Serialize
如果你想使自己的类暴露可克隆方法本身,你可以添加方法和实施ICloneable
这样的界面:
<Serializable()>
Public Class MyClass : Implements ICloneable
'NOTE - The Account class must also be Serializable
Public Property PersonAccount as Account
Public Property FirstName As String
Function Clone(ByRef orig As MyClass) As MyClass Implements ICloneable.Clone
' Don't serialize a null object, simply return the default for that object
If (Object.ReferenceEquals(orig, Nothing)) Then Return Nothing
Dim formatter As New BinaryFormatter()
Dim stream As New MemoryStream()
formatter.Serialize(stream, orig)
stream.Seek(0, SeekOrigin.Begin)
Return CType(formatter.Deserialize(stream), T)
End Function
End Class
注 :请注意ICloneable带有它的份额争议 ,因为它并不表示给调用者如果进行深或浅克隆。 在现实中,你并不需要的接口,以便能够在方法添加到您的类。