浅拷贝是指源对象与拷贝对象共用一份实体,仅仅是援用的变量差别(称号差别)。对个中任何一个对象的修改都邑影响别的一个对象。举个例子,一个人一开始叫张三,厥后改名叫李四了,但是照样统一个人,不管是张三缺胳膊少腿照样李四缺胳膊少腿,都是这个人倒运。
C#中有两种范例变量,一种 是值范例变量,一种是援用范例变量。关于前者,copy是属于通盘复制;而关于后者,平常的copy只是浅copy,相当于只通报一个援用指针一样。因而 关于后者举行真正copy的时刻,也是最省事的,详细的说,必需为其完成ICloneable接口中供应的Clone要领。
看看定义:
浅拷贝(影子克隆):只复制对象的基础范例,对象范例,仍属于本来的援用.
深拷贝(深度克隆):不紧复制对象的基础类,同时也复制原对象中的对象.就是说完全是新对象发生的.
浅拷贝和深拷贝的区分
浅拷贝是指将对象中的数值范例的字段拷贝到新的对象中,而对象中的援用型字段则指复制它的一个援用到目的对象。假如转变目的对象 中援用型字段的值他将反映在原是对象中,也就是说原始对象中对应的字段也会发生变化。深拷贝与浅拷贝差别的是关于援用的处置惩罚,深拷贝将会在新对象中建立一 个新的和原是对象中对应字段雷同(内容雷同)的字段,也就是说这个援用和原是对象的援用是差别的,我们在转变新对象中的这个字段的时刻是不会影响到原始对 象中对应字段的内容。所以关于原型形式也有差别的两种处置惩罚要领:对象的浅拷贝和深拷贝。
下面经由过程实例能够清晰看到浅拷贝与深拷贝的区分,代码以下:
using System; using System.Collections.Generic; using System.Text; namespace WindowsApplication1 { class Program { public class Sex { private string _PSex; public string PSex { set { _PSex = value; } get { return _PSex; } } } public class Person : ICloneable { private Sex _pSex = new Sex(); public int aa = 1213; public string pSex { set { _pSex.PSex = value; } get { return _pSex.PSex; } } private string _PName; public string PName { set { this._PName = value; } get { return this._PName; } } public void ShowPersonInfo() { Console.WriteLine("-------------------------"); Console.WriteLine("Name:{0} Sex:{1}", _PName, this.pSex); Console.WriteLine("-------------------------"); Console.WriteLine(this.aa); } //浅拷贝 public object Clone() { return this.MemberwiseClone(); } //深拷贝 public object DeepClone() { Person newP = new Person(); newP.PName = this._PName; newP.pSex = this.pSex; return newP; } } static void Main(string[] args) { Console.WriteLine("原对象:"); Person p = new Person(); p.PName = "JackLee"; p.pSex = "男"; p.ShowPersonInfo(); //浅拷贝 Person copy = (Person)p.Clone(); //深拷贝 Person dcopy = (Person)p.DeepClone(); Console.WriteLine("修改后的原对象:"); p.PName = "JackZhao"; p.pSex = "女"; p.aa = 1111; p.ShowPersonInfo(); Console.WriteLine("修改后的浅拷贝对象:"); copy.ShowPersonInfo(); Console.WriteLine("修改后的深拷贝对象:"); dcopy.ShowPersonInfo(); Console.WriteLine("直接拷贝对象:"); Person PP = p; PP.ShowPersonInfo(); Console.ReadLine(); } } }
好了,关于深拷贝与浅拷贝就说到这里,项目还没完事,先抓紧了。代码能够直接复制到项目中运转。
更多c# 深拷贝与浅拷贝的区分剖析及实例相干文章请关注ki4网!