1.浅拷贝与深拷贝
浅拷贝:只复制对象的基本类型,对象类型,仍属于原来的引用.
深拷贝:不紧复制对象的基本类,同时也复制原对象中的对象.就是说完全是新对象产生的.
2.浅拷贝与深拷贝的区别
浅拷贝是指将对象中的数值类型的字段拷贝到新的对象中,而对象中的引用型字段则指复制它的一个引用到目标对象。如果改变目标对象中引用型字段的值他将反映在原始对象中,也就是说原始对象中对应的字段也会发生变化。
深拷贝与浅拷贝不同的是对于引用的处理,深拷贝将会在新对象中创建一个新的和原始对象中对应字段相同(内容相同)的字段,也就是说这个引用和原始对象的引用是不同的,我们在改变新对象中的这个字段的时候是不会影响到原始对象中对应字段的内容。
3.浅拷贝与深拷贝测试
public class TestClass { public TestClass() { this.Num = 1; this.Remark = "r"; this.Data = new Data { Name = "a", SortNum = 1 }; } public int Num { get; set; } public string Remark { get; set; } public Data Data { get; set; } //浅拷贝 public TestClass Clone() { return (TestClass)this.MemberwiseClone(); } //深拷贝 public TestClass DeepClone() { TestClass t = new TestClass(); t.Num = this.Num; t.Remark = this.Remark; t.Data = new Data { Name = this.Data.Name, SortNum = this.Data.SortNum }; return t; } } public class Data { public string Name { get; set; } public int SortNum { get; set; } }
测试代码:
static void Main(string[] args) { TestClass t1 = new TestClass(); TestClass t2 = t1.Clone(); TestClass t3 = t1.DeepClone(); t1.Num = 2; t1.Remark = "r2"; t1.Data.SortNum = 2; t1.Data.Name = "b"; Console.WriteLine("t1 num:{0} remark:{1} name:{2} sortnum:{3}", t1.Num,t1.Remark, t1.Data.Name, t1.Data.SortNum); Console.WriteLine("t2 num:{0} remark:{1} name:{2} sortnum:{3}", t2.Num,t2.Remark, t2.Data.Name, t2.Data.SortNum); Console.WriteLine("t3 num:{0} remark:{1} name:{2} sortnum:{3}", t3.Num,t3.Remark, t3.Data.Name, t3.Data.SortNum); Console.ReadLine(); }
测试结果: