近来爱上一本书《编写高质量代码,改善C#程序的157个建议》,我想很多人都想编写高质量的代码,因为我们不仅仅是码农,更是一名程序员。

从今天开始,我将每天和大家分享这本书中的内容,并加上自己的理解,希望可以帮助到更多和我一样盲目的程序员们。

今天我们谈谈C#中的对象拷贝问题;

所谓的对象拷贝,其实就是为对象创建副本,C#中将拷贝分为两种,分别为浅拷贝和深拷贝;

所谓浅拷贝就是将对象中的所有字段复制到新的副本对象中;浅拷贝对于值类型与引用类型的方式有区别,值类型字段的值被复制到副本中后,在副本中的修改不会影响源对象对应的值;然而对于引用类型的字段被复制到副本中的却是引用类型的引用,而不是引用的对象,在副本中对引用类型的字段值被修改后,源对象的值也将被修改。

深拷贝也同样是将对象中的所有字段复制到副本对象中,但是,无论对象的值类型字段或者引用类型字段,都会被重新创建并复制,对于副本的修改,不会影响到源对象的本身;

当然,无论是哪种拷贝,微软都建议使用类型继承ICloneable接口的方式明确告诉调用者,该对象是否可用被拷贝。当然了,ICloneable接口只提供了一个声明为Clone的方法,我们可以根据需求在Clone的方法内实现浅拷贝或者是深拷贝,下面我们进行一段浅拷贝的案例,代码如下

 1     class Student : ICloneable
 2     {
 3         public string IDCode { get; set; }
 4 
 5         public int Age { get; set; }
 6 
 7         public Grent Grent { get; set; }
 8 
 9         #region 拷贝主体
10         public object Clone()
11         {
12             return this.MemberwiseClone();
13             //throw new NotImplementedException();
14         }
15         #endregion
16 
17     }
18 
19     class Grent
20     {
21         public string Name { get; set; }
22 
23         public override string ToString()
24         {
25             return this.Name;
26         }
27     }
View Code

相关文章: