[转载]原文地址: http://hi.baidu.com/genet/blog/item/bf7c2530e0ebf39ca8018e7d.html

C#中有两种类型变量,一种是值类型变量,一种是引用类型变量。对于前者,copy是属于全盘复制;而对于后者,一般的copy只是浅copy,相当于只传递一个引用指针一样。因此对于后者进行真正copy的时候,也是最费事的,具体的说,必须为其实现ICloneable接口中提供的Clone方法。
     浅拷贝(影子克隆):只复制对象的基本类型,对象类型,仍属于原来的引用.
     深拷贝(深度克隆):不紧复制对象的基本类,同时也复制原对象中的对象.就是说完全是新对象产生的.
     浅拷贝和深拷贝之间的区别:浅拷贝是指将对象中的数值类型的字段拷贝到新的对象中,而对象中的引用型字段则指复制它的一个引用到目标对象。如果改变目标对象中引用型字段的值他将反映在原是对象中,也就是说原始对象中对应的字段也会发生变化。深拷贝与浅拷贝不同的是对于引用的处理,深拷贝将会在新对象中创建一个新的和原是对象中对应字段相同(内容相同)的字段,也就是说这个引用和原是对象的引用是不同的,我们在改变新对象中的这个字段的时候是不会影响到原始对象中对应字段的内容。所以对于原型模式也有不同的两种处理方法:对象的浅拷贝和深拷贝。
     MemberwiseClone 方法创建一个浅表副本,方法是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。如果字段是值类型的,则对该字段执行逐位复制。如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其复本引用同一对象。深拷贝,即实现ICloneable接口.ICloneable可用于深拷贝和浅拷贝。
    示例代码如下:
       C# 示例Code
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 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("-------------------------");
            }
            //浅拷贝
            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.ShowPersonInfo();

Console.WriteLine("修改后的浅拷贝对象:");
            copy.ShowPersonInfo();
            Console.WriteLine("修改后的深拷贝对象:");
            dcopy.ShowPersonInfo();

Console.WriteLine("直接拷贝对象:");
            Person PP = p;
            PP.ShowPersonInfo();
           
            Console.ReadLine();

}
      
    }
    运行结果如下:

说明:当然对于深拷贝还可以有其它的实现,比如说用序列化的方法等等。
    在JavaScript中的也有对象的浅拷贝与深拷贝,看下面的例子:
     JavaScript中的示例代码Code
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
</HEAD>

<BODY>
<SCRIPT LANGUAGE="JavaScript">
<!--

function Object.prototype.clone(){
    var newObj = new Object();
    for(elements in this){
        newObj[elements] = this[elements];
    }
    return newObj;
}

function Object.prototype.cloneAll(){
    function clonePrototype(){}
    clonePrototype.prototype = this;
    var obj = new clonePrototype();
    for(var ele in obj){
        if(typeof(obj[ele])=="object") obj[ele] = obj[ele].cloneAll();
    }
    return obj;
}

var obj1            = new Object();
    obj1.Team            = "First";
    obj1.Powers            = new Array("Iori","Kyo");
    obj1.msg            = function(){alert()};
    obj1.winner            = new Object();
    obj1.winner.name    = obj1.Powers[0];
    obj1.winner.age        = 23;
    obj1.winner.from    = "Japan"

var obj1_clone            = obj1.cloneAll();
    obj1_clone.Team            = "Second";
    obj1_clone.Powers        = new Array("Jimmy","Anndy");
    obj1_clone.winner.name    = obj1_clone.Powers[1];
    obj1_clone.winner.age    = 22;
    obj1_clone.winner.from    = "USA";

msg = "2003界拳皇单打独斗杯,拳皇挑战赛: /n/n   A组 对战形式:/n/n"
    msg += obj1.Team+" 组 ,人员名单:"+obj1.Powers+"/n";
    msg += "第一轮过后,胜利者为:"+obj1.winner.name +" ,参赛者年龄:"+obj1.winner.age+" ,来自岛国: "+obj1.winner.from+"/n";
    msg += "/n/n   B组 对战形式:/n/n"
    msg += obj1_clone.Team+" 组 ,人员名单:"+obj1_clone.Powers+"/n";
    msg += "第一轮过后,胜利者为:"+obj1_clone.winner.name +" ,参赛者年龄:"+obj1_clone.winner.age+" ,来自国际警察部队: "+obj1_clone.winner.from+"/n";
    alert(msg);

//-->
</SCRIPT>
</BODY>
</HTML>

作者:duanmengchao 发表于2010-4-25 16:02:00 原文链接
阅读:28 评论:0 查看评论

转载于:https://www.cnblogs.com/duanjie/archive/2010/04/25/2489162.html

[转]c#对象的浅拷贝和深拷贝相关推荐

  1. 对象的浅拷贝和深拷贝

    对象的浅拷贝和深拷贝 简要介绍 代码实现 简要介绍 浅拷贝:python拷贝一般都是浅拷贝.拷贝时,对象包含的子对象内容不拷贝.因此,源对象和拷贝对象引用同一个对象 深拷贝:使用copy模块的deep ...

  2. 拷贝Python对象、浅拷贝、深拷贝

    浅拷贝和深拷贝在C++中出现和使用的较多,python也有相应的用法. test1 = ['a','c','b','d','f'] print id(test1) test2 = test1 prin ...

  3. python中不可变对象_Python中的可变对象与不可变对象、浅拷贝与深拷贝

    Python中的对象分为可变与不可变,有必要了解一下,这会影响到python对象的赋值与拷贝.而拷贝也有深浅之别. 不可变对象 简单说就是某个对象存放在内存中,这块内存中的值是不能改变的,变量指向这块 ...

  4. Python —对象的浅拷贝和深拷贝

    变量的赋值操作 只是形成两个变量,实际还是指向同一个对象. 浅拷贝 Python 拷贝一般都是浅拷贝(copy.copy).拷贝时,对象包含的子对象内容不拷贝.因此,源对象和拷贝对象会引用同一个子对象 ...

  5. python—类和对象之浅拷贝和深拷贝详细讲解

    一.变量的赋值操作 定义:只是形成2个变量,实际上还是指向同一个对象 代码如下: 内存示意图: 将创建CPU类的实例对象赋值给cpu1进行储存,所以cpu1的id为0212, 然后将cpu1赋值给cp ...

  6. Python对象的浅拷贝与深拷贝

    在讲我们深浅拷贝之前,我们需要先区分一下拷贝和赋值的概念.看下面的例子 a = [1,2,3] 赋值: b = a 拷贝: b = a.copy() 上面的两行代码究竟有什么不同呢?带着这个问题,继续 ...

  7. 【Python基础】对象的浅拷贝与深拷贝

    Python的赋值操作一般都是存储对象的引用,而不是对象的拷贝.因为如果直接对对象进行拷贝,那么运行将会比较缓慢,而且我们实际开发大部分场景都是希望引用对象而不是拷贝对象.当然了,如果你明确要求拷贝, ...

  8. Python 零基础入门到实战(一)笔记:内置对象、浅拷贝、深拷贝、计算圆面积、凯撒密码、英文大小写转换、输入国家打印出国家名和首都、输入数字英文输出、统计句子中的字母数量、猜随机数

    Python入门到实战(一) 为什么写这篇文章 Part 1 入门部分 什么是编程语言? Python的优势 目前应用 特点 Part 2 6种内置对象 1 整数.浮点数 2 字符串 3 列表 4 元 ...

  9. 【JS专栏】JS对象的浅拷贝与深拷贝

    浅拷贝 自己创建一个新的对象,来接受你要重新复制或引用的对象值.如果对象属性是基本的数据类型,复制的就是基本类型的值给新对象:但如果属性是引用数据类型,复制的就是内存中的地址,如果其中一个对象改变了这 ...

  10. python 实例对象 浅拷贝_Python对象中的浅拷贝和深拷贝

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. Python中的赋值语句不会创建对象的副本,而只是给对象绑定了新的名称.对于不可变对象,这通常没什么区别. ...

最新文章

  1. Python 知识点笔记:走进面向对象
  2. PasswordEncoder详解
  3. cookie和session的详解与区别
  4. jt808终端鉴权_GitHub - SmallChi/JT808: JT808协议、GB808协议、道路运输车辆卫星定位系统-北斗兼容车载终端通讯协议(支持2013、2019版本)...
  5. 关闭防火墙linux出错,linux关闭防火墙【应对办法】
  6. SASS实现颜色卡动画
  7. C语言——深度剖析数据在内存中的存储
  8. 叶胜超:可以让你保本的8条投资经验!
  9. 基于FPGA的USB高速数据采集系统(免做上位机)
  10. 运维(39) 通过KubeSphere部署SpringBoot到K8S案例 DevOps
  11. 清明时节,思念友人张锦文
  12. 网站建设的基本流程及服务端开发简介
  13. 评估托管SDWAN服务
  14. 游戏行业回暖,但距离春天还有一段距离
  15. 应用概率统计-第一章 随机事件及其概率
  16. CSS基础3-float、溢出属性
  17. Unknown host 'maven.google.com'
  18. ethtool 开启网卡_Linux 网卡特性配置ethtool详解
  19. 卡通渲染——眼睛面部
  20. 高德地图根据点标记位置自动调整地图缩放级别

热门文章

  1. lol服务器维护局,lol维护局 英雄联盟钻石维护局掉多少分
  2. IE 浏览器阻止打印页面的方法
  3. 美团2018校园招聘内推笔试代码分享
  4. LibreOJ - 10066 新的开始
  5. 【luogu3403】跳楼机 [同余最短路]
  6. 机动车驾驶证扣分查询
  7. python葡萄酒数据集_葡萄酒质量数据集分析
  8. win7蓝牙怎么连接_小米智能手环怎么连接手机蓝牙
  9. IntelliJ IDEA中文汉化教程
  10. PC改变文档显示颜色,保护眼睛,缓解眼疲劳