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#中的深复制与浅复制相关推荐

  1. C#中的深复制和浅复制(在C#中克隆对象)

    C#中的深复制和浅复制(在C#中克隆对象) 转载于:https://www.cnblogs.com/dalovess/p/7002947.html

  2. python列表浅复制_Python列表的深复制和浅复制示例详解

    一.深复制与浅复制 列表是Python中自带的一种数据结构,在使用列表时,拷贝操作不可避免,下面简单讨论一下列表的深复制(拷贝)与浅复制 首先看代码: l1 = [5, 4, 3, 2, 1] # 用 ...

  3. python list 深复制_Python列表的深复制和浅复制示例详解

    免费资源网,https://freexyz.cn/ 一.深复制与浅复制 列表是Python中自带的一种数据结构,在使用列表时,拷贝操作不可避免,下面简单讨论一下列表的深复制(拷贝)与浅复制 首先看代码 ...

  4. C++学习基础七——深复制与浅复制

    C++学习基础七--深复制与浅复制 一.深复制与浅复制基本知识 深复制和浅复制,又称为深拷贝和浅拷贝. 深复制和浅复制的区别如下图1所示: 图1 图1表示的是,定义一个类CDemo,包含int a和c ...

  5. 深复制VS浅复制(MemberwiseClone方法介绍)

    MemberwiseClone方法,属于命名空间System,存在于程序集 mscorlib.dll中.返回值是System.Object.其含义是:创建一个当前object对象的浅表副本. MSDN ...

  6. Objective-C 深复制和浅复制与NSCopying协议

    1.简单复制只能实现浅拷贝:指针赋值,使两个指针指向相同的一块内存空间,操作不安全. 2. Foundation类已经遵守了<NSCopying>和 <NSMutableCopyin ...

  7. iOS 集合的深复制与浅复制

    2019独角兽企业重金招聘Python工程师标准>>> 概念 对象拷贝有两种方式:浅复制和深复制.顾名思义,浅复制,并不拷贝对象本身,仅仅是拷贝指向对象的指针:深复制是直接拷贝整个对 ...

  8. [C++]深复制与浅复制

    深复制与浅复制 C++中,默认的复制构造函数只能实现浅复制. 浅复制指的是在对象复制前,只对对象中的数据成员进行简单的复制 大多数情况下"浅复制"已经能很好的工作了,但是当类的数据 ...

  9. C++深拷贝和浅拷贝(深复制和浅复制)完全攻略

    C++深拷贝和浅拷贝(深复制和浅复制)完全攻略 对于基本类型的数据以及简单的对象,它们之间的拷贝非常简单,就是按位复制内存.例如: class Base{public:Base(): m_a(0), ...

最新文章

  1. OC之@property和@synthesize
  2. Week1 Team Homework #2 from Z.XML-Introduction of team member with photos
  3. 如何实现蓝牙空中升级BLE OTA
  4. Linux操作(3)—— 重定向操作
  5. LeetCode——Kth Largest Element in an Array
  6. 前端学习(1738):前端调试值之快速切换pc和手机端
  7. 图像配准之特征点匹配的思考
  8. 属性的表示方法和对象的枚举
  9. mysql序列 mybatis_MySQL实现序列(Sequence)效果以及在Mybatis中如何使用这种策略
  10. 全国中小学生计算机竞赛试题,全国中小学电脑制作活动
  11. 刷新tabpanel中的子项目内容
  12. 你敲键盘的声音,出卖了你 | 附开源代码
  13. 前端学HTTP之客户端识别和cookie
  14. 社区活动 | Apache Flink Meetup·深圳站,锁定 Flink 最佳实践
  15. linux web目录安全设置,[LNMP]Linux的Web环境的安全配置
  16. 用EasyPoi导入Excel
  17. 威富通实现微信支付概述
  18. ASM PCRP21-100-1-SSI-KAB5M
  19. Django博客开发(十三)—一个简单的站内搜索
  20. C语言之关系运算符与逻辑运算符小结

热门文章

  1. 基于Serverless的云原生转型实践
  2. Serverless在游戏运营行业进行数据采集分析的最佳实践 链接:
  3. 微服务框架Go-Micro集成Nacos实战之服务注册与发现
  4. 干货收藏 | 如何优化前端性能?
  5. 知识图谱数据构建的“硬骨头”,阿里工程师如何拿下?
  6. Python基础——PyCharm版本——第八章、文件I/O(核心1)
  7. Oracle任务调度的高级选项
  8. Tomcat可运行源码资源分享
  9. 1.Lambda表达式(新手写的!新手写的!新手写的!)(未完成)
  10. Wi-Fi模块的设置方法汇总