use*_*359 6 vb.net class object deep-copy visual-studio-2012
我可以请一些帮助来执行对象的深层复制.
这是我的代码:
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
Run Code Online (Sandbox Code Playgroud)
Field也是我自己写的一堂课.
我需要修改Clone()函数以返回深层副本?
小智 5
(顺便说一句,我可能会将你的课程命名为"Class"以外的东西).
如果您想手动完成所有操作,则需要按照以下步骤操作:
Clone()方法.如果你还没有这样做,那么这可能涉及它的Clone()方法创建一个新的类型对象,Field然后根据当前对象填充其每个属性.如果您的Field类具有其他类/复杂类型的属性(例如您自己创建的类),那么它们也应该实现Clone(),您应该调用Clone()它们来创建新的深层副本Clone()的类方法中,您将创建一个类型为[Class]的新对象,例如通过调用其构造函数Name新对象的Name属性设置为当前对象的属性List(Of Field),让我们称之为listA为例For Each item in _ListOfFields
listA.Add(item.Clone())
End
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
这可以通过将类中的所有信息序列化为可移植对象然后重写它以切断任何引用指针来实现.
注意:传入的类和它作为属性公开的任何其他类必须标记
<Serializable()>才能使用BinaryFormatter.Serialize
如果你想让你自己的类公开clonable方法本身,你可以添加方法并实现如下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
Run Code Online (Sandbox Code Playgroud)
注意:请注意ICloneable会引起争议,因为它不会向调用者表明它是执行深度还是浅度克隆.实际上,您不需要界面就可以将方法添加到您的类中.