zoukankan      html  css  js  c++  java
  • 关于C#类对象克隆问题: 浅克隆和深克隆

    运行下面一段代码,就知道了:

      1 using System;
      2 using System.Collections.Generic;
      3 using System.IO;
      4 using System.Linq;
      5 using System.Runtime.Serialization.Formatters.Binary;
      6 using System.Text;
      7 
      8 namespace DeepCloneProj
      9 {
     10     class Program
     11     {
     12         static void Main(string[] args)
     13         {
     14             A originalInstance = new A(1, "Norton");
     15             originalInstance.A3.Add(2);
     16             originalInstance.A3.Add(3);
     17 
     18             WriteData("[SOURCE]", originalInstance);
     19 
     20             Console.WriteLine("-----------------BEFORE-------------------------");
     21 
     22             A shallowClonedInstance = originalInstance.Clone() as A;
     23             WriteData("[SHALLOW CLONED]", shallowClonedInstance);
     24 
     25             Console.WriteLine("-----------------BEFORE-------------------------");
     26 
     27             A deepClonedInstance = originalInstance.DeepClone() as A;
     28             WriteData("[DEEP CLONED]", deepClonedInstance);
     29 
     30             Console.WriteLine("-----------------BEFORE-------------------------");
     31             Console.WriteLine();
     32             Console.WriteLine("Change the A2 value: originalInstance.A2="FlexWorkflow"");
     33             originalInstance.A2 = "FlexWorkflow";
     34             Console.WriteLine("Add a new value for originalInstance.A3: originalInstance.A3.Add(100)");
     35             Console.WriteLine();
     36             originalInstance.A3.Add(100);
     37 
     38             Console.WriteLine("-----------------AFTER-------------------------");
     39 
     40             WriteData("[SOURCE]", originalInstance);
     41 
     42             Console.WriteLine("-----------------AFTER-------------------------");
     43 
     44             WriteData("[SHALLOW CLONED]", shallowClonedInstance);
     45 
     46             Console.WriteLine("-----------------AFTER-------------------------");
     47 
     48             WriteData("[DEEP CLONED]", deepClonedInstance);
     49 
     50             Console.Read();
     51 
     52         }
     53 
     54         private static void WriteData(string source, A originalInstance)
     55         {
     56             Console.WriteLine("Instance:{0}", source);
     57             Console.WriteLine("originalInstace.A1:{0}", originalInstance.A1);
     58             Console.WriteLine("originalInstace.A2:{0}", originalInstance.A2);
     59             Console.WriteLine("originalInstace.A3:");
     60             foreach (int value in originalInstance.A3)
     61             {
     62                 Console.WriteLine(value);
     63             }
     64         }
     65     }
     66 
     67     [Serializable]
     68     public class A : ICloneable
     69     {
     70         private int _a1;
     71         private string _a2;
     72         private IList<int> _a3;
     73 
     74         public A(int a1, string a2)
     75         {
     76             this._a1 = a1;
     77             this._a2 = a2;
     78             this._a3 = new List<int>();
     79         }
     80 
     81         public int A1
     82         {
     83             get
     84             {
     85                 return this._a1;
     86             }
     87         }
     88 
     89         public string A2
     90         {
     91             get
     92             {
     93                 return this._a2;
     94             }
     95             set
     96             {
     97                 this._a2 = value;
     98             }
     99         }
    100 
    101         public IList<int> A3
    102         {
    103             get
    104             {
    105                 return this._a3;
    106             }
    107         }
    108 
    109         public object DeepClone()
    110         {
    111             object clonedInstance = null;
    112             using (MemoryStream stream = new MemoryStream())
    113             {
    114                 try
    115                 {
    116                     BinaryFormatter formatter = new BinaryFormatter();
    117                     formatter.Serialize(stream, this);
    118                     stream.Position = 0;
    119                     clonedInstance = formatter.Deserialize(stream);
    120                 }
    121                 catch
    122                 {
    123                     throw;
    124                 }
    125             }
    126 
    127             return clonedInstance;
    128         }
    129 
    130         public object Clone()
    131         {
    132             return MemberwiseClone();
    133         }
    134     }
    135 }

     运行结果:

    Instance:[SOURCE]
    originalInstace.A1:1
    originalInstace.A2:Norton
    originalInstace.A3:
    2
    3
    -----------------BEFORE-------------------------
    Instance:[SHALLOW CLONED]
    originalInstace.A1:1
    originalInstace.A2:Norton
    originalInstace.A3:
    2
    3
    -----------------BEFORE-------------------------
    Instance:[DEEP CLONED]
    originalInstace.A1:1
    originalInstace.A2:Norton
    originalInstace.A3:
    2
    3
    -----------------BEFORE-------------------------
    
    Change the A2 value: originalInstance.A2="FlexWorkflow"
    Add a new value for originalInstance.A3: originalInstance.A3.Add(100)
    
    -----------------AFTER-------------------------
    Instance:[SOURCE]
    originalInstace.A1:1
    originalInstace.A2:FlexWorkflow
    originalInstace.A3:
    2
    3
    100
    -----------------AFTER-------------------------
    Instance:[SHALLOW CLONED]
    originalInstace.A1:1
    originalInstace.A2:Norton
    originalInstace.A3:
    2
    3
    100
    -----------------AFTER-------------------------
    Instance:[DEEP CLONED]
    originalInstace.A1:1
    originalInstace.A2:Norton
    originalInstace.A3:
    2
    3
    
  • 相关阅读:
    Hall定理
    c#汉字转为拼音
    asp.net导出Excel 按照预定格式,以及解决导出乱码
    asp.net导出Excel
    SQL正常工作日上班安排
    SQL做日历
    T-SQL数组循环
    存储过程删除 用于更改,
    数组操作-去除重复和空白元素
    TreeView递归取值
  • 原文地址:https://www.cnblogs.com/Min-min/p/5591806.html
Copyright © 2011-2022 走看看