c# 深拷贝与浅拷贝的区别分析及实例

时间:2023-06-29 05:00:06 

      深拷贝是指源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外一个对象造成影响。举个例子,一个人名叫张三,后来用他克隆(假设法律允许)了另外一个人,叫李四,不管是张三缺胳膊少腿还是李四缺胳膊少腿都不会影响另外一个人。比较典型的就是Value(值)对象,如预定义类型Int32,Double,以及结构(struct),枚举(Enum)等。

      浅拷贝是指源对象与拷贝对象共用一份实体,仅仅是引用的变量不同(名称不同)。对其中任何一个对象的改动都会影响另外一个对象。举个例子,一个人一开始叫张三,后来改名叫李四了,可是还是同一个人,不管是张三缺胳膊少腿还是李四缺胳膊少腿,都是这个人倒霉。

      C#中有两种类型变量,一种 是值类型变量,一种是引用类型变量。对于前者,copy是属于全盘复制;而对于后者,一般的copy只是浅copy,相当于只传递一个引用指针一样。因此 对于后者进行真正copy的时候,也是最费事的,具体的说,必须为其实现ICloneable接口中提供的Clone方法。

看看定义:
      浅拷贝(影子克隆):只复制对象的基本类型,对象类型,仍属于原来的引用.
      深拷贝(深度克隆):不紧复制对象的基本类,同时也复制原对象中的对象.就是说完全是新对象产生的.

浅拷贝和深拷贝的区别
      浅拷贝是指将对象中的数值类型的字段拷贝到新的对象中,而对象中的引用型字段则指复制它的一个引用到目标对象。如果改变目标对象 中引用型字段的值他将反映在原是对象中,也就是说原始对象中对应的字段也会发生变化。深拷贝与浅拷贝不同的是对于引用的处理,深拷贝将会在新对象中创建一 个新的和原是对象中对应字段相同(内容相同)的字段,也就是说这个引用和原是对象的引用是不同的,我们在改变新对象中的这个字段的时候是不会影响到原始对 象中对应字段的内容。所以对于原型模式也有不同的两种处理方法:对象的浅拷贝和深拷贝。

下面通过实例可以清楚看到浅拷贝与深拷贝的区别,代码如下:


using System;
 using System.Collections.Generic;
 using System.Text;

 namespace WindowsApplication1
 {
     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 int aa = 1213;

             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("-------------------------");
                 Console.WriteLine(this.aa);
             }
             //浅拷贝
             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.aa = 1111;
             p.ShowPersonInfo();

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

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

             Console.ReadLine();

 
         }

     }
 }

好了,关于深拷贝与浅拷贝就说到这里,项目还没完事,先抓紧了。代码可以直接复制到项目中运行。

标签:深拷贝,浅拷贝
0
投稿

猜你喜欢

  • Winform让DataGridView左侧显示图片

    2021-09-24 03:50:38
  • 基于Idea+Jconsole实现线程监控步骤

    2021-07-29 10:39:40
  • 基于maven的三种packaging方式

    2021-09-30 22:15:05
  • C#序列化与反序列化实例

    2023-05-05 21:05:27
  • 详解Java实现数据结构之并查集

    2023-09-05 08:47:06
  • Android 处理 View 重复点击的多种方法

    2022-03-05 17:10:03
  • 在Unity中捕捉Android的常用按钮返回事件

    2023-01-31 00:11:36
  • WinForm绘制圆角的方法

    2023-06-21 14:23:51
  • Java 二分查找算法的实现

    2022-07-23 11:10:13
  • Mybatis初始化知识小结

    2023-11-01 13:59:27
  • Java-JFrame-swing嵌套浏览器的具体步骤

    2022-11-26 19:30:10
  • Spring @Transaction 注解执行事务的流程

    2022-12-30 15:41:23
  • response对象的使用(实例讲解)

    2023-11-30 12:23:22
  • 详解Struts2中json 相互引用死循环解决办法

    2022-09-08 04:04:46
  • Kotlin基本数据类型详解

    2022-10-05 04:36:23
  • 详解Java匿名内部类

    2023-04-30 14:51:28
  • Spring中的事务隔离级别和传播行为

    2022-07-21 18:18:24
  • @Autowired注解在抽象类中失效的原因及解决

    2021-07-15 06:12:04
  • Android中应用多进程的整理总结

    2022-05-05 04:25:21
  • Flutter中数据库的使用教程详解

    2023-12-09 11:16:28
  • asp之家 软件编程 m.aspxhome.com