Quoted from: http://blog.csdn.net/yl2isoft/article/details/12200513
一开始,先对C#深拷贝与浅拷贝知识做个简单的总结。
无论是浅拷贝与深拷贝,C#都将源对象中的所有字段复制到新的对象中。不过,对于值类型字段,引用类型字段以及字符串类型字段的处理,两种拷贝方式存在一定的区别(见下表)。
深拷贝有多种实现方法,最简单的方法是手动创建字段,并对字段逐个进行赋值。但这种方法容易出错,也就是说,如果类型的字段发生变化或有增减,那么该拷贝方法也要发生相应的变化,所以,建议使用序列化的形式来进行深拷贝。
下面给出完整的演示代码。
using System; using System.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; namespace DeepCloneExp { class Program { static void Main(string[] args) { Person p = new Person() { Name="tiana0",Age=20,Job=new Job(){JobName="Coder"} }; Person p1 = p.ShallowClone(); Person p2 = p.DeepClone(); Console.WriteLine("p浅拷贝-->p1;p深拷贝-->p2"); Console.WriteLine("p修改前:p.Name={0},p.Age={1},p.Job.JobName={2}", p.Name, p.Age, p.Job.JobName); Console.WriteLine("p修改前:p1.Name={0},p1.Age={1},p1.Job.JobName={2}", p1.Name, p1.Age, p1.Job.JobName); Console.WriteLine("p修改前:p2.Name={0},p2.Age={1},p2.Job.JobName={2}", p2.Name, p2.Age, p2.Job.JobName); //修改p的所有字段值 p.Name = "tiana10000"; p.Age = 28; p.Job.JobName = "Manager"; Console.WriteLine(); Console.WriteLine("p修改后:p.Name={0},p.Age={1},p.Job.JobName={2}", p.Name, p.Age, p.Job.JobName); Console.WriteLine("p修改后:p1.Name={0},p1.Age={1},p1.Job.JobName={2}", p1.Name, p1.Age, p1.Job.JobName); Console.WriteLine("p修改后:p2.Name={0},p2.Age={1},p2.Job.JobName={2}", p2.Name, p2.Age, p2.Job.JobName); } } [Serializable] class Person:ICloneable { public int Age { get; set; } //值类型字段 public string Name { get; set; } //字符串 public Job Job { get; set; } //引用类型字段 //深拷贝 public Person DeepClone() { using (Stream objectStream = new MemoryStream()) { IFormatter formatter = new BinaryFormatter(); formatter.Serialize(objectStream,this); objectStream.Seek(0, SeekOrigin.Begin); return formatter.Deserialize(objectStream) as Person; } } public object Clone() { return this.MemberwiseClone(); } //浅拷贝 public Person ShallowClone() { return this.Clone() as Person; } } [Serializable] public class Job { public string JobName { get; set; } public override string ToString() { return this.JobName; } } }
运行程序,得到以下结果:
对于演示代码,仅补充说明: Person 类与Job类均需添加标志[Serializable],否则运行时会报错。
好了,就扯到这里了。
相关推荐
浅复制(Shallow Copy)是指创建一个新的对象,然后将原对象引用的所有属性值复制到新对象中。这意味着如果属性中包含的是引用类型,那么新旧对象共享同一块内存空间。而深复制(Deep Copy)则是不仅复制对象本身,...
浅拷贝(Shallow Copy): 浅拷贝创建了一个新对象,但是只复制了原对象中的值类型字段。对于引用类型字段,它复制的是引用,而不是引用指向的对象。这意味着新对象和原对象共享同一个引用类型字段的对象实例。如果...
在Python编程语言中,"copy"模块提供了对对象复制的功能,包括浅拷贝(shallow copy)和深拷贝(deep copy)。这两种拷贝方式在处理复杂数据结构时尤为重要,因为它们之间的区别会影响到拷贝的对象及其引用。让我们...
在编写自定义的复制构造函数和赋值运算符时,还需要遵循一些最佳实践,如"拷贝-and-swap"策略(Copy-and-Swap Idiom)。这个策略在赋值运算符中先创建一个临时对象,然后交换这个临时对象和当前对象的成员,这样可以...
shallow_copy = copy.copy(original) # 修改原对象的引用类型属性 original.list.append(4) print(original.list) # 输出:[1, 2, 3, 4] print(shallow_copy.list) # 输出:[1, 2, 3, 4] ``` 接下来,我们看深...
1.Difference between shallow copy and deep copy? 浅复制和深复制的区别? 答案:浅层复制:只复制指向对象的指针,而不复制引用对象本身。 深层复制:复制引用对象本身。 意思就是说我有个A对象,复制一份...
复制构造函数在C++中涉及到两种复制类型:浅复制(shallow copy)和深复制(deep copy)。浅复制仅仅复制对象的指针,导致多个对象指向相同的内存区域,这在复制包含指针的复杂对象时会引起问题。深复制则复制指针所...
深拷贝(Deep Copy)则更复杂,它不仅复制对象本身,还会递归地复制对象引用的对象。换句话说,深拷贝创建的是一个完全独立的对象,即使修改了原始对象,也不会影响到深拷贝的对象。在Java中,实现深拷贝通常需要...
当一个对象的`copy`属性被设置时,它会创建该对象的一个副本,这个副本通常是一个浅拷贝(shallow copy),除非对象实现了`NSCopying`协议并返回深拷贝(deep copy)。浅拷贝只复制对象本身,而不复制它所包含的对象...
Python中的`copy`模块提供了两种方法来复制对象:浅复制(shallow copy)和深复制(deep copy)。这两个概念在处理复杂数据结构如列表、字典、集合等时尤为重要,因为它们涉及到对象引用的问题。 浅复制是通过`copy...
深拷贝(Deep Copy)与浅拷贝(Shallow Copy)是两种不同的拷贝方式。浅拷贝仅仅复制对象的引用,而不是创建新的对象。这意味着原始对象和拷贝对象指向同一块内存空间,任何一方对数据的修改都会影响到另一方。而深...
Python中的`copy`模块提供了两种复制对象的方式:浅复制(shallow copy)和深复制(deep copy)。这两种复制方法在处理复杂数据结构如列表、字典等时有着显著的区别。 ### 浅复制 浅复制是默认的复制行为,通过`....
3. 浅复制(Shallow Copy): 浅复制是指创建一个新的对象,该对象拥有原始对象的属性值,但这些属性如果是引用类型,则指向的是同一块内存区域。也就是说,原始对象和副本对象共享相同的内部资源。如果这些共享的...
这种默认行为在大多数简单情况下是合适的,但当对象包含动态分配的内存(如指针)时,可能会引发问题,因为这可能导致浅复制(Shallow Copy),而不是深复制(Deep Copy),从而引起悬挂指针或内存泄漏。 拷贝构造...
然而,Python提供了类似的功能,包括浅拷贝(shallow copy)和深拷贝(deep copy),通过`copy`模块来实现。 拷贝构造函数的主要目的是在创建新对象时,将已有对象的属性和状态复制过来,这样新旧对象虽然属性相同...
There are two main types of copies: shallow and deep. ##### Shallow Copies A shallow copy creates a new collection that contains references to the same objects as the original collection. Changes ...
深拷贝(Deep Copy)指的是创建一个新的对象,并将原对象中的所有元素都复制到新对象中。这种复制不仅包括基本类型的元素,还包括嵌套的对象引用。也就是说,如果原对象中包含的是另一个对象的引用,深拷贝会创建这...
* CopyHelper:深浅复制(Shallow and deep copy) * EqualityHelper:比较数据对象的相等性 SDO 提供了一个统一的数据访问模型,使得开发人员可以更方便地访问和操作数据,从而提高应用程序的开发效率和可维护性。
因此,为了正确地处理这类对象,我们需要定义自定义的拷贝构造函数和赋值运算符来实现深复制(deep copy),确保每个对象都有自己的独立内存。 在《C++ How to Program》第8版的第9.10章中,作者详细介绍了如何定义...