浅拷贝:
引用成员在被拷贝时,仅被复制原对象中引用成员的地址引用到新生对象,使用复制后的新对象、
若更改引用成员内
的值
可能
会
影响源对象
深拷贝:
引用成员在被拷贝时,深入拷贝所有引用成员,而不是拷贝地址引用那样简单、新对象中包含的
所有成员、全部是新生
对象
在使用复制后的新对象不会影响源对象
浅拷贝在.NET中通常使用,System::Object::MemberwiseClone 直接进行快速拷贝、
<__DynamicallyInvokable(), SecuritySafeCritical()>
<MethodImpl(MethodImplOptions.InternalCall)>
Protected Function MemberwiseClone() As Object
下面是一个用于被序列化复制的类,“Deep Cory 深拷贝”、“Shallow Copy 浅拷贝”
需要被序列化的类,一定需要在类的顶部添加上<Serializable>特性 否则无法使用
如果不允许成员被序列化,应该在成员上方添加<NonSerialized>特性即可、
<Serializable>
Public Class DeepCopy
Private mValue As Integer
Public Property Value As Integer
Return Me.mValue
End Get
Set(value As Integer)
Me.mValue = value
End Set
End Property
End Class
下面的代码主要是一个调用测试被序列化复制后修改成员中的值是否会影响源对象的成员
Sub Main()
Dim x = New DeepCopy()
x.Value = 250
Dim y As DeepCopy = Clone(x)
y.Value = 100
Console.WriteLine("X={0}, Y={1}", x.Value, y.Value)
Console.ReadKey(False)
End Sub
即使是浅拷贝上面的代码也不会影响源对象中成员,我在上面提到只有引用成员会被影响
而值类型成员不会相互影响、
浅拷贝引用单个引用成员指针依旧需要消耗足足4~8个字节、受处理器与开发平台制约
Public Function Clone(ByVal obj) As Object
Using ms As MemoryStream = New MemoryStream()
Dim fm = New BinaryFormatter()
fm.Serialize(ms, obj)
ms.Seek(0, SeekOrigin.Begin)
Return fm.Deserialize(ms)
End Using
End Function
上面是序列化深度复制的一个代码,创建内存流对象 MemoryStream
且创建
二进制序列化对象BinaryFormatter
BinaryFormatter::
Serialize // 序列化
BinaryFormatter::Deserialize // 反序列化
把对象序列化后,Stream::Seek在结束位置,我们需要移动位置到
流的开始处
才可以
反序列化对象 否则会产生错误
Public Function IL_Clone(ByVal obj) As Object
Dim dm = New DynamicMethod("Clone", GetType(Object), {GetType(Object)})
Dim il = dm.GetILGenerator()
Dim il_0033 = il.DefineLabel()
Dim il_DE84 = il.DeclareLocal(GetType(MemoryStream))
Dim il_FA10 = il.DeclareLocal(GetType(BinaryFormatter))
Dim il_BCC2 = il.DeclareLocal(GetType(Object))
Dim iL_CS10 = il.DeclareLocal(GetType(Object))
il.Emit(OpCodes.Newobj, GetType(MemoryStream).GetConstructor({}))
il.Emit(OpCodes.Stloc_0)
il.Emit(OpCodes.Newobj, GetType(BinaryFormatter).GetConstructor({}))
il.Emit(OpCodes.Stloc_1)
il.Emit(OpCodes.Ldloc_1)
il.Emit(OpCodes.Ldloc_0)
il.Emit(OpCodes.Ldarg_0)
il.Emit(OpCodes.Callvirt, GetType(BinaryFormatter).GetMethod("Serialize", {GetType(MemoryStream), GetType(Object)}))
il.Emit(OpCodes.Ldloc_0)
il.Emit(OpCodes.Ldc_I4_0)
il.Emit(OpCodes.Conv_I8)
il.Emit(OpCodes.Ldc_I4_0)
il.Emit(OpCodes.Callvirt, GetType(MemoryStream).GetMethod("Seek", {GetType(Int64), GetType(SeekOrigin)}))
il.Emit(OpCodes.Pop)
il.Emit(OpCodes.Ldloc_1)
il.Emit(OpCodes.Ldloc_0)
il.Emit(OpCodes.Callvirt, GetType(BinaryFormatter).GetMethod("Deserialize", {GetType(MemoryStream)}))
il.Emit(OpCodes.Stloc_2)
il.Emit(OpCodes.Ldloc_0)
il.Emit(OpCodes.Callvirt, GetType(MemoryStream).GetMethod("Close", {}))
il.Emit(OpCodes.Ldloc_2)
il.Emit(OpCodes.Stloc_3)
il.Emit(OpCodes.Br_S, il_0033)
il.MarkLabel(il_0033)
il.Emit(OpCodes.Ldloc_3)
il.Emit(OpCodes.Ret)
Return dm.Invoke(dm, {obj})
End Function
上面是通过内嵌IL代码,实现对象的深拷贝 本质上是上上面代码的一个
机器写法 功能是相同的 做法也是相同的 只是一个调用Using一个Close
差异性并不是很大 依赖的命名空间
Imports System
Imports System.IO
Imports System.Reflection.Emit
Imports System.Runtime.Serialization.Formatters.Binary
在3DMAX里面,做好一个物体(父物体)以后,可以选择Edit菜单中的Clone,下面有三中选项:
Copy
(生成一个同模样的子物体,两者的操作互不影响),Instance(父子互动,父物体的操作同样影响子物体,子物体也一样),还有一个Reference(暂不考虑)。
在
VB.NET
,
本课程用
VB.NET
结合GDI+,从无到有开发一个功能较完整的交互式CAD系统。作者有交互式CAD系统、动态几何系统开发经验。出版过交互式CAD系统开发方面的图书。课程先讲准备知识,然后讲整个系统的开发思路和主要技术,最后将整个系统分成8个版本,从最简单的绘图开始,逐步添加功能,循序渐进地进行讲解。知识点讲解细致,系统。课程的核心在于源代码,学习每章内容之前,请先下载本章源码。建议先自行对源码进行阅读分析,然后带着问题去听课,这样学习效率比较高,效果比较好一些。课程最终提供的内容和服务:PPT+源码+视频讲解+答疑/****课程第一节课为免费课,演示了系统的主要功能。可以用手机或电脑观看。如果无法观看,请私信我。谢谢!*****/友情提醒:凭订单信息可找平台客服开具发票。购买系列课程提供打包价,购买讲师卡更划算。
如图所示,将List A列表复制时,其实相当于A的内容复制给了B,java中相同内容的数组指向同一地址,即进行浅拷贝后A与B指向同一地址。
造成的后果就是,改变B的同时也会改变A,因为改变B就是改变B所指向地址的内容,由于A也指向同一地址,所以A与B一起改变。
这也就是List的浅拷贝,其常见的实现方式有如下几种:
1、遍历循环复制
List<Person> destList=ne
初学
VB.Net
,总结一下ByVal和ByRef 1 通过ByVal传递的变量,
VB.Net
会复制与源值相等的一个新的变量。而ByRef则相当于引用。 例如我们学习C的时候得Swap()函数 Imports System Test that Cant Swap A and B Class MyApp Public Shared Sub Main() Dim A As Integer =
浅拷贝:指对象的字段被拷贝,而字段引用的对象不会被拷贝,拷贝对象和原对象仅仅是引用名称有所不同,但是它们共用一份实体。对任何一个对象的改变,都会影响到另外一个对象。大部分的引用类型,实现的都是浅拷贝,引用类型对象之间的赋值,就是复制一个对象引用地址的副本,而指向的对象实例仍然是同一个。
深拷贝
:指对象的子段被拷贝,同时字段引用的对象也进行了拷贝。
深拷贝
创建的是整个源对象的结构,拷贝对象和原对象相...
Public Class A1 : Implements ICloneable
Public para1 As String = "111"
Public para2 As String = "222"
Public Function Clone() As Object Implements System.ICloneabl
这是jq的方法。
$.extend( [
deep
], target, object1 [, objectN ] )
deep
表示是否
深拷贝
,为true为
深拷贝
,为false,则为浅拷贝
target Object类型 目标对象,其他对象的成员属性将被附加到该对象上。
object1 objectN可选。 Object类型 第一个以及第N个被合并的对象。
这是js方法
深拷贝
、浅拷贝基础:http://blog.csdn.net/songshimvp1/article/deta
il
s/48244599
*********************************************************************************************************************************
//_tmp和result是相互独立的,没有任何联系,有各自的存储空间。
let
deep
Clone = function (obj) {
let _tmp = JSON.stringify(obj);//将对象转换为json字符串形式
let result = JSON.parse(_tmp);//将转换而来的字符串转换为原生js对象
return...