关于C#类对象克隆问题: 浅克隆和深克隆

Posted 我喂自己袋盐_1989

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于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

 

以上是关于关于C#类对象克隆问题: 浅克隆和深克隆的主要内容,如果未能解决你的问题,请参考以下文章

js浅克隆和深克隆--个人理解

java中的浅克隆和深克隆是啥

C#对象克隆介绍

java对象的浅克隆和深克隆

.net core 浅克隆和深克隆/浅拷贝和深拷贝

克隆_浅拷贝和深拷贝