关于值类型和引用类型:

浅度复制(shallow copy)只复制值类型(char,int )的值,而对于引用类型不会复制,浅度复制可以通过派生于System.Object的MemberwiseClone()方法来完成,这是一个受保护的方法。因为他并没有考虑引用类型成员,因此新对象的引用成员就会指向源对象中的相同成员引用的对象

如果要创建成员的新实例(复制值,而不是复制引用)就需要用到深度复制(deep copy)

深度复制需要实现一个ICloneable接口,如果使用这个接口需要实现它包含的Clone()方法,这个方法返回一个System.Object的值,

下面看下浅度复制:

 public class Company
{
public string value { get; set; }
} public class Phone
{
public string color { get; set; } public Company company = new Company(); public Phone (string newCompany)
{
company.value = newCompany;
} public object getCopy()
{
return MemberwiseClone();
}
}
  static void Main(string[] args)
{
Phone phone = new Phone("xiaomi");
phone.color = "red";
Phone phone1 = (Phone)phone.getCopy();
Console.WriteLine($"phone company:{phone.company.value} color: {phone.color}");
Console.WriteLine($"phone1 company:{phone1.company.value} color: {phone1.color}"); Console.WriteLine("浅度复制修改新对象的值"); phone1.company.value = "huawei";
phone1.color = "green";
Console.WriteLine($"phone company:{phone.company.value} color: {phone.color}");
Console.WriteLine($"phone1 company:{phone1.company.value} color: {phone1.color}");
Console.ReadKey(); }

实验现象:

浅度复制在后引用类型修改后,原对象也跟着发生了改变

修改这个问题,可以使用深度复制

 public class Company
{
public string value { get; set; }
} public class Phone:ICloneable
{
public string color { get; set; } public Company company = new Company(); public Phone (string newCompany)
{
company.value = newCompany;
} public object getCopy()
{
return MemberwiseClone();
} public object Clone()
{
Phone newPhone = new Phone(company.value);
return newPhone;
//newPhone.company.value = this.company.value; }
}
 static void Main(string[] args)
{
Phone phone = new Phone("xiaomi");
phone.color = "red";
Phone phone1 = (Phone)phone.Clone();
Console.WriteLine($"phone company:{phone.company.value} color: {phone.color}");
Console.WriteLine($"phone1 company:{phone1.company.value} color: {phone1.color}"); Console.WriteLine("浅度复制修改新对象的值"); phone1.company.value = "huawei";
phone1.color = "green";
Console.WriteLine($"phone company:{phone.company.value} color: {phone.color}");
Console.WriteLine($"phone1 company:{phone1.company.value} color: {phone1.color}");
Console.ReadKey(); }

实验现象

c#学习笔记-深度复制 与浅度复制的更多相关文章

  1. .NET基础之深度复制和浅度复制

    之前一直没有搞清楚深度复制和浅度复制的区别到底在哪里,今天彻底把这个东西弄懂了,写出来与到家共勉. 如果大家不懂值类型和引用类型的区别,请先看http://www.cnblogs.com/Autumo ...

  2. C#深度复制和浅度复制

    C#深度复制和浅度复制 复制一个值变量很简单,新建一个变量然后将原来的变量赋值过去就行,但是复制一个引用变量这种方法是不行的,如果不明白为什么可以先看看这篇解释 引用类型变量和值类型变量在赋值时的不同 ...

  3. Dynamic CRM 2013学习笔记(十四)复制/克隆记录

    经常有这样的需求,一个单据上有太多要填写的内容,有时还关联多个子单据,客户不想一个一个地填写,他们想从已有的单据上复制数据,克隆成一条新的记录.本文将介绍如何克隆一条记录,包括它的子单据以生成一条新的 ...

  4. JavaScript学习笔记——JS中的变量复制、参数传递和作用域链

    今天在看书的过程中,又发现了自己目前对Javascript存在的一个知识模糊点:JS的作用域链,所以就通过查资料看书对作用域链相关的内容进行了学习.今天学习笔记主要有这样几个关键字:变量.参数传递.执 ...

  5. java学习笔记之字符流文件复制

    字符文件复制 FileReader fr =new FileReader("b.txt");//绑定源文件 FileWriter fw= new FileWriter(" ...

  6. MongodDB学习笔记(二)(复制)

    mongoDB的复制非常容易配置,其实现有两种方式,一种是主从复制,一种是复制集,前者的好处是容易配置,但是如果主服务器宕掉了,整个系统就崩溃了,后者的好处是如果主服务器宕掉了,其他服务器会通过投票选 ...

  7. Linux学习笔记:cp和scp复制文件

    拷贝文件和文件夹,在Linux上通过cp命令来实现. cp:用户当前机器的文件复制 scp:通过ssh本机和其他机器的文件复制 secure copy cp a.txt b.txt scp a.txt ...

  8. redis学习笔记——RDB、AOF和复制时对过期键的处理

    AOF.RDB和复制功能对过期键的处理 生成RDB文件 在执行SAVE命令或者BGSAVE命令创建一个新的RDB文件时,程序会对数据库中的键进行检查,已过期的键不会被保存到新创建的RDB文件中.举个例 ...

  9. MongoDB学习笔记(六、MongoDB复制集与分片)

    目录: MongoDB部署模型 MongoDB可复制集 MongoDB读写分离 分片架构部署 最佳实践 MongoDB部署模型: 单机 -> 可复制集 -> 分片集群 MongoDB可复制 ...

随机推荐

  1. xgboost 源码学习

    官方代码结构解析,README.MD XGboost 回归时,损失函数式平方误差损失 分类时,是对数自燃损失: Coding Guide ====== This file is intended to ...

  2. [java]三种自定义链表排序方式

    代码: import java.util.ArrayList; import java.util.Comparator; import java.util.List; class Emp{ Strin ...

  3. nodejs取参四种方法 req.body, req.params, req.param, req.body

    获取请求很中的参数是每个web后台处理的必经之路,nodejs的 express框架 提供了四种方法来实现. req.body req.query req.params req.param() 首先介 ...

  4. win10下安装Kafka

    去kafka官网(http://kafka.apache.org/downloads.html)下最新包(目前是2.3.0),不分操作系统,直接点二进制压缩包链接跳过去下载即可 -> 解压到你指 ...

  5. 使用Lock对象实现同步效果

    Lock是一个接口,为了使用一个Lock对象,需要用到   Lock lock = new ReentrantLock();   与 synchronized (someObject) 类似的,loc ...

  6. Jmeter与BlazeMeter使用 录制导出jmx

    本文链接:https://blog.csdn.net/weixin_38250126/article/details/82629876JMeter 的脚本录制,除了自带的HTTP代理服务器以外,被大家 ...

  7. CSS3 @font-face详细用法

    @font-face是CSS3中的一个模块,他主要是把自己定义的Web字体嵌入到你的网页中,随着@font-face模块的出现,我们在Web的开发中使用字体就不用再为只能使用Web安全字体烦恼了!肯定 ...

  8. Ubuntu LVS DR模式生产环境部署

    1.环境说明 系统版本:ubuntu14.04 LVS服务器:14.17.64.3 真实服务器:14.17.64.4-12 VIP:14.17.64.13 部署目的:用户请求14.17.64.13的报 ...

  9. OpenGL学习笔记 之一 (基本的图形绘制)

    参考网址:http://www.cnblogs.com/FredCong/archive/2012/10/13/2722893.html #include <glut.h> #includ ...

  10. 基本 Java Bean

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...