zoukankan      html  css  js  c++  java
  • c# 深拷贝与浅拷贝的区别分析及实例

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

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

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

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

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

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

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

      1 using System;
      2  using System.Collections.Generic;
      3  using System.Text;
      4 
      5  namespace WindowsApplication1
      6  {
      7      class Program
      8      {
      9          public class Sex
     10          {
     11              private string _PSex;
     12              public string PSex
     13              {
     14                  set
     15                  {
     16                      _PSex = value;
     17                  }
     18                  get
     19                  {
     20                      return _PSex;
     21                  }
     22              }
     23 
     24          }
     25 
     26          public class Person : ICloneable
     27          {
     28 
     29              private Sex _pSex = new Sex();
     30              public int aa = 1213;
     31 
     32              public string pSex
     33              {
     34                  set
     35                  {
     36                      _pSex.PSex = value;
     37                  }
     38                  get
     39                  {
     40                      return _pSex.PSex;
     41                  }
     42              }
     43              private string _PName;
     44              public string PName
     45              {
     46                  set
     47                  {
     48                      this._PName = value;
     49                  }
     50                  get
     51                  {
     52                      return this._PName;
     53                  }
     54              }
     55 
     56              public void ShowPersonInfo()
     57              {
     58                  Console.WriteLine("-------------------------");
     59                  Console.WriteLine("Name:{0} Sex:{1}", _PName, this.pSex);
     60                  Console.WriteLine("-------------------------");
     61                  Console.WriteLine(this.aa);
     62              }
     63              //浅拷贝
     64              public object Clone()
     65              {
     66                  return this.MemberwiseClone();
     67              }
     68              //深拷贝
     69              public object DeepClone()
     70              {
     71                  Person newP = new Person();
     72                  newP.PName = this._PName;
     73                  newP.pSex = this.pSex;
     74                  return newP;
     75              }
     76 
     77          }
     78 
     79          static void Main(string[] args)
     80          {
     81              Console.WriteLine("原对象:");
     82              Person p = new Person();
     83              p.PName = "JackLee";
     84              p.pSex = "";
     85 
     86              p.ShowPersonInfo();
     87 
     88  
     89              //浅拷贝        
     90              Person copy = (Person)p.Clone();
     91              //深拷贝
     92              Person dcopy = (Person)p.DeepClone();
     93 
     94  
     95              Console.WriteLine("修改后的原对象:");
     96              p.PName = "JackZhao";
     97              p.pSex = "";
     98              p.aa = 1111;
     99              p.ShowPersonInfo();
    100 
    101  
    102              Console.WriteLine("修改后的浅拷贝对象:");
    103              copy.ShowPersonInfo();
    104              Console.WriteLine("修改后的深拷贝对象:");
    105              dcopy.ShowPersonInfo();
    106 
    107              Console.WriteLine("直接拷贝对象:");
    108              Person PP = p;
    109              PP.ShowPersonInfo();
    110 
    111              Console.ReadLine();
    112 
    113  
    114          }
    115 
    116      }
    117  }
  • 相关阅读:
    数据库中的 索引
    JQuery中ajax请求
    如何优化广告,提高点击率
    常用的正则表达式
    全栈工程师之路中级篇之小程序开发前言
    ionic入门教程第四课使用$controllerProvider按需加载controller
    全栈工程师之路中级篇之小程序开发第一章第一节注册小程序
    ionic入门教程第三课在项目中使用requirejs分离controller文件和server文件
    ionic入门教程第五课举例子说明异步回调$q及$q在项目中的用法
    求两个整数的最大公约数和最小公倍数
  • 原文地址:https://www.cnblogs.com/zk-zhou/p/6760277.html
Copyright © 2011-2022 走看看