`
北极的。鱼
  • 浏览: 158993 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

【转】shallow and deep copy

    博客分类:
  • C#
 
阅读更多

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],否则运行时会报错。

好了,就扯到这里了。

  • 大小: 45.9 KB
  • 大小: 15.1 KB
分享到:
评论

相关推荐

    android 浅复制和深复制-Java Generic Deep Copy 篇

    浅复制(Shallow Copy)是指创建一个新的对象,然后将原对象引用的所有属性值复制到新对象中。这意味着如果属性中包含的是引用类型,那么新旧对象共享同一块内存空间。而深复制(Deep Copy)则是不仅复制对象本身,...

    浅拷贝和深拷贝深入理解(shallow copy VS deep copy)

    浅拷贝(Shallow Copy): 浅拷贝创建了一个新对象,但是只复制了原对象中的值类型字段。对于引用类型字段,它复制的是引用,而不是引用指向的对象。这意味着新对象和原对象共享同一个引用类型字段的对象实例。如果...

    copy的使用(深拷贝、浅拷贝)

    在Python编程语言中,"copy"模块提供了对对象复制的功能,包括浅拷贝(shallow copy)和深拷贝(deep copy)。这两种拷贝方式在处理复杂数据结构时尤为重要,因为它们之间的区别会影响到拷贝的对象及其引用。让我们...

    Copy Constructors and Assignment Operators终极解释

    在编写自定义的复制构造函数和赋值运算符时,还需要遵循一些最佳实践,如"拷贝-and-swap"策略(Copy-and-Swap Idiom)。这个策略在赋值运算符中先创建一个临时对象,然后交换这个临时对象和当前对象的成员,这样可以...

    copy 深/浅

    shallow_copy = copy.copy(original) # 修改原对象的引用类型属性 original.list.append(4) print(original.list) # 输出:[1, 2, 3, 4] print(shallow_copy.list) # 输出:[1, 2, 3, 4] ``` 接下来,我们看深...

    ios面试题锦集chm版

    1.Difference between shallow copy and deep copy?
浅复制和深复制的区别?
 答案:浅层复制:只复制指向对象的指针,而不复制引用对象本身。
深层复制:复制引用对象本身。
意思就是说我有个A对象,复制一份...

    operator overloading and copy constructors 英文原版

    复制构造函数在C++中涉及到两种复制类型:浅复制(shallow copy)和深复制(deep copy)。浅复制仅仅复制对象的指针,导致多个对象指向相同的内存区域,这在复制包含指针的复杂对象时会引起问题。深复制则复制指针所...

    关于java中的深copy与浅copy的问题

    深拷贝(Deep Copy)则更复杂,它不仅复制对象本身,还会递归地复制对象引用的对象。换句话说,深拷贝创建的是一个完全独立的对象,即使修改了原始对象,也不会影响到深拷贝的对象。在Java中,实现深拷贝通常需要...

    复制对象(二)<NSCopying>协议和属性的copy特性对应的Demo

    当一个对象的`copy`属性被设置时,它会创建该对象的一个副本,这个副本通常是一个浅拷贝(shallow copy),除非对象实现了`NSCopying`协议并返回深拷贝(deep copy)。浅拷贝只复制对象本身,而不复制它所包含的对象...

    python-copy函数用法.doc

    Python中的`copy`模块提供了两种方法来复制对象:浅复制(shallow copy)和深复制(deep copy)。这两个概念在处理复杂数据结构如列表、字典、集合等时尤为重要,因为它们涉及到对象引用的问题。 浅复制是通过`copy...

    deep-copy-js:javascript的递归深拷贝、克隆和浅拷贝函数

    深拷贝(Deep Copy)与浅拷贝(Shallow Copy)是两种不同的拷贝方式。浅拷贝仅仅复制对象的引用,而不是创建新的对象。这意味着原始对象和拷贝对象指向同一块内存空间,任何一方对数据的修改都会影响到另一方。而深...

    python-copy函数用法.docx

    Python中的`copy`模块提供了两种复制对象的方式:浅复制(shallow copy)和深复制(deep copy)。这两种复制方法在处理复杂数据结构如列表、字典等时有着显著的区别。 ### 浅复制 浅复制是默认的复制行为,通过`....

    复制对象(一)copy和mutableCopy方法对应Demo

    3. 浅复制(Shallow Copy): 浅复制是指创建一个新的对象,该对象拥有原始对象的属性值,但这些属性如果是引用类型,则指向的是同一块内存区域。也就是说,原始对象和副本对象共享相同的内部资源。如果这些共享的...

    面向对象程序设计英文教学课件:08 Copy Control.ppt

    这种默认行为在大多数简单情况下是合适的,但当对象包含动态分配的内存(如指针)时,可能会引发问题,因为这可能导致浅复制(Shallow Copy),而不是深复制(Deep Copy),从而引起悬挂指针或内存泄漏。 拷贝构造...

    python-拷贝构造函数.docx

    然而,Python提供了类似的功能,包括浅拷贝(shallow copy)和深拷贝(deep copy),通过`copy`模块来实现。 拷贝构造函数的主要目的是在创建新对象时,将已有对象的属性和状态复制过来,这样新旧对象虽然属性相同...

    Collections

    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)指的是创建一个新的对象,并将原对象中的所有元素都复制到新对象中。这种复制不仅包括基本类型的元素,还包括嵌套的对象引用。也就是说,如果原对象中包含的是另一个对象的引用,深拷贝会创建这...

    如何让使用SDO

    * CopyHelper:深浅复制(Shallow and deep copy) * EqualityHelper:比较数据对象的相等性 SDO 提供了一个统一的数据访问模型,使得开发人员可以更方便地访问和操作数据,从而提高应用程序的开发效率和可维护性。

    面向对象程序设计英文教学课件:08-Copy-Control.pptx

    因此,为了正确地处理这类对象,我们需要定义自定义的拷贝构造函数和赋值运算符来实现深复制(deep copy),确保每个对象都有自己的独立内存。 在《C++ How to Program》第8版的第9.10章中,作者详细介绍了如何定义...

Global site tag (gtag.js) - Google Analytics