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

最新文章

  1. RDS MySQL 空间问题的原因和解决
  2. UIImageView异步加载网络图片
  3. 获取oracle 里的表名与字段
  4. POJ 1948 Triangular Pastures【二维01背包】
  5. How does database indexing work?
  6. [AngularJS] Directive with Transcluded Elements
  7. JNI与多线程
  8. SharePoint 2013 讨论板列表"Connect to Outlook" 不可用解决方案
  9. 模拟new实例化对象。
  10. 贪心+树状数组维护一下 Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) D
  11. 前端性能优化--图片处理(Css Sprites 与 base64)
  12. crm --- 1.admin , 展示列表 和 分页
  13. 处理返回键劫持(结合vue)
  14. OpenSessionInViewFilter 的配置及作用(原文地址: http://blog.csdn.net/sunsea08/article/details/4545186)
  15. KMP算法(——模板习题与总结)
  16. Asp.Net_上传文件(ftp、webClient、webService)
  17. ORACLE中Drop table cascade constraints之后果.
  18. SQL Server 2008 收缩日志(log)文件
  19. 核密度估计 Kernel Density Estimation (KDE) MATLAB
  20. oracle执行完shutdown immediate后登陆不上了怎么办

热门文章

  1. IntelliJ IDEA于Make Project时报:子字符串不是票面金额的结束、非法的表达式显示启动
  2. Swift——(两)Swift访问元组
  3. Ubuntu 中查看内核版本和系统版本的三个命令
  4. C# 反射技术应用
  5. 【Leetcode】Sort List (Sorting)
  6. FPGA 异步时钟处理方
  7. 如何从 0 开始学 Ruby on Rails
  8. 微信原生支付 Native扫码支付( V3.3.7 版本)
  9. Java初认识--Java语言的书写规范及基本的运算符
  10. REDGATE SQL TEST的使用