首页 / C# / C#中的深复制与浅复制
C#中的深复制与浅复制
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#中的深复制与浅复制,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2367字,纯文字阅读大概需要4分钟。
内容图文
![C#中的深复制与浅复制](/upload/InfoBanner/zyjiaocheng/741/507049b39e5f491a89c2554464ce9ff0.jpg)
C#中分为值类型和引用类型,值类型的变量直接包含其数据,而引用类型的变量则存储对象的引用。
对于值类型,每个变量都有自己的数据副本,对一个变量的操作不可能影响到另一个变量。如
class Program { static void Main(string[] args) { int a = 3; int b=a; a = 5; Console.WriteLine("a={0},b={1}",a,b); Console.ReadKey(); } }
输出为:
a=5,b=3
而对于引用类型,两个变量可能引用同一个对象,因此对一个变量的操作可能影响到另一个变量所引用的对象。
public class A { public int param; public A(int i) { this.param = i; } } A a1 = new A(5); A a2 = a1; a1.param = 10; Console.WriteLine("a1.param={0},a2.param={1}",a1.param,a2.param); Console.ReadKey();
输出为:
a1.param=10,a2.param=10
可见改变了a1中的param值,也会同样改变a2中的param值,因为它们指向的是同一个实例,其实就是同一个。
浅复制:实现浅复制需要使用Object类的MemberwiseClone方法创建一个浅表副本。
深复制:需实现ICloneable接口中的Clone方法,重新实例化一个对象作为返回值。
对于复制对象中的值类型,结果正确:
public class Person :ICloneable { private int age; public int Age { get { return age; } set { this.age = value; } } public Person(int i) { this.age = i; } public object Clone() { //return this.MemberwiseClone(); return new Person(this.age) as object; } } Person p1 = new Person(5); Person p2 = (Person)p1.Clone(); p1.Age = 10; Console.WriteLine("p1.age={0},p2.age={1}",p1.Age,p2.Age); Console.ReadKey();
利用 return this.MemberwiseClone()和return new Person(this.age) as object输出的值均为:
p1.age=10,p2.age=5
但是若是复制对象中的引用类型时,浅复制就会出现问题,如下:
public class Education { public int score; } public class Person:ICloneable { public Education education=new Education (); public Person(int i) { education.score = i; } public object Clone() { return this.MemberwiseClone(); //return new Person(this.education.score) as object; } }
Person p1 = new Person(59); Person p2 = (Person)p1.Clone(); p1.education.score = 99; Console.WriteLine("p1.education.score={0},p2.education.score={1}", p1.education.score, p2.education.score); Console.ReadKey();
当用return this.MemberwiseClone()时,即用浅复制时,输出为:
p1.education.score=99,p2.education.score=99
这与原来的代码意图不符,当用return new Person(this.education.score) as object时,输出为
p1.education.score=99,p2.education.score=59
转载于:https://www.cnblogs.com/Celvin-Xu/p/3206568.html
内容总结
以上是互联网集市为您收集整理的C#中的深复制与浅复制全部内容,希望文章能够帮你解决C#中的深复制与浅复制所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。