C#中的深复制与浅复制
2024-10-19 01:29:39
C#中分为值类型和引用类型,值类型的变量直接包含其数据,而引用类型的变量则存储对象的引用。
对于值类型,每个变量都有自己的数据副本,对一个变量的操作不可能影响到另一个变量。如
class Program
{
static void Main(string[] args)
{
int a = ;
int b=a;
a = ;
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();
A a2 = a1;
a1.param = ;
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();
Person p2 = (Person)p1.Clone();
p1.Age = ;
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();
Person p2 = (Person)p1.Clone();
p1.education.score = ;
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
最新文章
- RDS MySQL 空间问题的原因和解决
- UIImageView异步加载网络图片
- 获取oracle 里的表名与字段
- POJ 1948 Triangular Pastures【二维01背包】
- How does database indexing work?
- [AngularJS] Directive with Transcluded Elements
- JNI与多线程
- SharePoint 2013 讨论板列表";Connect to Outlook"; 不可用解决方案
- 模拟new实例化对象。
- 贪心+树状数组维护一下 Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) D
- 前端性能优化--图片处理(Css Sprites 与 base64)
- crm --- 1.admin , 展示列表 和 分页
- 处理返回键劫持(结合vue)
- OpenSessionInViewFilter 的配置及作用(原文地址: http://blog.csdn.net/sunsea08/article/details/4545186)
- KMP算法(——模板习题与总结)
- Asp.Net_上传文件(ftp、webClient、webService)
- ORACLE中Drop table cascade constraints之后果.
- SQL Server 2008 收缩日志(log)文件
- 核密度估计 Kernel Density Estimation (KDE) MATLAB
- oracle执行完shutdown immediate后登陆不上了怎么办
热门文章
- IntelliJ IDEA于Make Project时报:子字符串不是票面金额的结束、非法的表达式显示启动
- Swift——(两)Swift访问元组
- Ubuntu 中查看内核版本和系统版本的三个命令
- C# 反射技术应用
- 【Leetcode】Sort List (Sorting)
- FPGA 异步时钟处理方
- 如何从 0 开始学 Ruby on Rails
- 微信原生支付 Native扫码支付( V3.3.7 版本)
- Java初认识--Java语言的书写规范及基本的运算符
- REDGATE SQL TEST的使用