C#中List<T>对象的深度拷贝问题
在编写对List<T>的对象进行赋值时,遇到深度和浅度拷贝问题。其中T是自定义类型。
例如:
1 public class NewClass 2 { 3 public int ValueIntegraty { get; set; } 4 5 }
1 static void Main(string[] args) 2 { 3 List<NewClass> list1 = new List<NewClass>(); 4 List<NewClass> list2 = new List<NewClass>(); 5 6 NewClass a = new NewClass(); 7 a.ValueIntegraty = 5; 8 list2.Add(a); 9 list1 = list2; 10 a.ValueIntegraty = 10; 11 Console.WriteLine(list1[0].ValueIntegraty); 12 }
其中:输出为10,并不是我们想象的5。原因是我们进行了浅度拷贝,而我们希望结果是深度拷贝。
故重写类NewClass
1 [Serializable] 2 public class NewClass 3 { 4 public int ValueIntegraty { get; set; } 5 6 #region ICloneable 成员 7 8 public object Clone() 9 { 10 return this.MemberwiseClone(); 11 } 12 13 #endregion 14 15 public NewClass DeepClone() 16 { 17 using (Stream objectStream = new MemoryStream()) 18 { 19 IFormatter formatter = new BinaryFormatter(); 20 formatter.Serialize(objectStream, this); 21 objectStream.Seek(0, SeekOrigin.Begin); 22 return formatter.Deserialize(objectStream) as NewClass; 23 } 24 } 25 public NewClass ShallowClone() 26 { 27 return Clone() as NewClass; 28 } 29 }
Main函数重新写调用代码:
1 List<NewClass> list1 = new List<NewClass>(); 2 List<NewClass> list2 = new List<NewClass>(); 3 4 NewClass a = new NewClass(); 5 a.ValueIntegraty = 5; 6 list2.Add(a); 7 list1 = list2; 8 a.ValueIntegraty = 10; 9 Console.WriteLine(list1[0].ValueIntegraty); 10 11 list1 = new List<NewClass>(); 12 foreach (NewClass i in list2) 13 { 14 list1.Add(i.DeepClone()); 15 } 16 a.ValueIntegraty = 15; 17 Console.WriteLine(list1[0].ValueIntegraty);
输出结果分别是10和10,第二个结果是我们所希望的。
参考:
[1] http://www.cnblogs.com/luminji/archive/2011/02/02/1948826.html
[2] http://blog.csdn.net/xjavasunjava/article/details/7648242