zoukankan      html  css  js  c++  java
  • 浅度复制VS深度复制

    对于引用类型的复制,通过MemberwiseClone()复制的只是引用,即myclone1和myclone2的myContent是相同的对象实例。一个改变值,另一个也会改变。因为myContent.Val是公共字段。

    值对象则没有这种顾虑

    PS:感觉ICloneable 接口并没有什么用,完全可以自己写方法。毕竟ICloneable里面只有一个Clone方法。

    代码如下:

     1    class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             Cloner myclone1 = new Cloner(5);
     6 
     7             // 浅度复制
     8             Cloner myclone2 = (Cloner)myclone1.GetCopy();
     9             Console.WriteLine("myclone2.myContent.Val:" + myclone2.myContent.Val);
    10             myclone1.myContent.Val = 10; // 修改了myclone1,myclone2也会变
    11             Console.WriteLine("myclone2.myContent.Val:" + myclone2.myContent.Val);
    12 
    13             // 深度复制
    14             Cloner myclone3 = (Cloner)myclone1.DeepClone();
    15             Console.WriteLine("myclone3.myContent.Val:"+myclone3.myContent.Val);
    16             myclone1.myContent.Val = 15; // 修改了myclone1,myclone2不会变
    17             Console.WriteLine("myclone3.myContent.Val:" + myclone3.myContent.Val);
    18 
    19             Console.ReadKey();
    20         }
    21     }
    22 
    23     public class Content
    24     {
    25         public int Val;
    26     }
    27 
    28     public class Cloner //:ICloneable
    29     {
    30         public Content myContent = new Content();// 引用类型才行,值类型不行
    31 
    32         public Cloner(int newVal)
    33         {
    34             myContent.Val = newVal;
    35         }
    36 
    37         public object GetCopy() // 浅度复制
    38         {
    39             return MemberwiseClone();// 创建浅表副本
    40         }
    41 
    42         public object DeepClone() // 深度复制
    43         {
    44             Cloner clonedCloner = new Cloner(myContent.Val);
    45             return clonedCloner;
    46         }
    47     }

     运行结果:

  • 相关阅读:
    n-1位数
    关于VC预定义常量_WIN32,WIN32,_WIN64
    python中的闭包
    TCP粘包, UDP丢包, nagle算法
    C++中 explicit的用法
    为什么mysql索引要使用B+树,而不是B树,红黑树
    屏障和屏障属性
    带有超时的读写锁
    pthread_mutex_timedlock
    段错误以及调试方式
  • 原文地址:https://www.cnblogs.com/shelly0307/p/7614365.html
Copyright © 2011-2022 走看看