`
北极的。鱼
  • 浏览: 150514 次
  • 性别: 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
分享到:
评论

相关推荐

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

    浅拷贝和深拷贝深入理解(shallow copy VS deep copy) 本文重点讨论引用类型变量的拷贝机制和实现

    python中阶基础

    3.9. * copy ——Shallow and deep copy operations 18 4. 函数 20 4.1. 什么是函数? 20 4.2. 函数的用处 20 4.3. 函数中的参数传递 20 4.4. 默认参数 20 4.5. 不定长参数 21 4.6. 递归函数 21 4.7. 拓展知识:...

    ios面试题锦集chm版

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

    Absolute C++

    Chapter 10 Example of Shallow Copy vs. Deep Copy, page 459 Solution to Programming Project 10.5, page 469 Chapter 11 Avoiding Multiple Defi nitions with #ifndef, page 484 Solution to Programming ...

    python浅拷贝、深拷贝

    在Python中,浅拷贝(shallow copy)和深拷贝(deep copy)是用于创建对象副本的两种常见方式。它们可以应用于不同类型的对象,如列表、字典、集合等。下面是对浅拷贝和深拷贝的描述: 浅拷贝:浅拷贝是创建一个新...

    Programming in Objective-C 4th Edition

    The copy and mutableCopy Methods 413 Shallow Versus Deep Copying 416 Implementing the <NSCopying> Protocol 418 Copying Objects in Setter and Getter Methods Exercises 423 19 Archiving 425 Archiving ...

    详解iOS的深浅拷贝

    浅复制(shallow copy):在浅复制操作时,对于被复制对象的每一层都是指针复制。 深复制(one-level-deep copy):在深复制操作时,对于被复制对象,至少有一层是深复制。 完全复制(real-deep copy):在完全复制操作...

    javascript中的变量是传值还是传址的?

    标题中的4个术语,对应的英文分别是:shallow copy(注意,不是shadow copy)、deep copy、pass by value、pass by reference(或pass by address)。传址和传引用是一回事。 一门编程语言的核心是数据结构,粗略来...

    IOS ObjectiveC中的赋值与对象拷贝

    在开发过程中我们经常会遇到对象拷贝的问题,下面我们分别讨论赋值操作、对象拷贝、以及浅拷贝(Shallow copy)与深拷贝(Deep copy)的区别与各自的实现方式。 一、不同对象的赋值操作 Objective-C中有两类对象,...

    编译器角度看C++复制构造函数

     浅拷贝(deep copy)与深拷贝(shallow copy)  我们首先来看复制构造函数涉及的两个概念:浅拷贝与深拷贝。假设有两个对象:A与B,它们是同类型的,下面分析B=A时浅拷贝与深拷贝行为。  浅拷贝:  浅拷贝...

    python3.6.5参考手册 chm

    PEP 471 - os.scandir() function – a better and faster directory iterator PEP 475: Retry system calls failing with EINTR PEP 479: Change StopIteration handling inside generators PEP 485: A function...

    Java中的深拷贝和浅拷贝介绍

    对象拷贝(Object Copy)就是将一个对象的属性拷贝到另一个有着相同类类型的对象中去。在程序中拷贝对象是很常见的,主要...Java中有三种类型的对象拷贝:浅拷贝(Shallow Copy)、深拷贝(Deep Copy)、延迟拷贝(Lazy Copy)

    Python Cookbook英文版

    2.10 Finding the Deep Index of an Item in an Embedded Sequence 2.11 Showing Off Quicksort in Three Lines 2.12 Sorting Objects Using SQL's ORDER BY Syntax 3. Text 3.1 Processing a String One ...

    好用的phpExcel

    * Implement PHP __clone to create a deep clone, not just a shallow copy. */ public function __clone() { $vars = get_object_vars($this); foreach ($vars as $key => $value) { if (is_object($...

    NETCFSERUP

    <param name="bRecurseIntoSubClasses">A boolean flag that when true performs a deep copy of the parameters, otherwise a shallow copy is performed.</param> <returns>An object that represents the ...

Global site tag (gtag.js) - Google Analytics