c#学习笔记-深度复制 与浅度复制
关于值类型和引用类型:
浅度复制(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#学习笔记-深度复制 与浅度复制的更多相关文章
- .NET基础之深度复制和浅度复制
之前一直没有搞清楚深度复制和浅度复制的区别到底在哪里,今天彻底把这个东西弄懂了,写出来与到家共勉. 如果大家不懂值类型和引用类型的区别,请先看http://www.cnblogs.com/Autumo ...
- C#深度复制和浅度复制
C#深度复制和浅度复制 复制一个值变量很简单,新建一个变量然后将原来的变量赋值过去就行,但是复制一个引用变量这种方法是不行的,如果不明白为什么可以先看看这篇解释 引用类型变量和值类型变量在赋值时的不同 ...
- Dynamic CRM 2013学习笔记(十四)复制/克隆记录
经常有这样的需求,一个单据上有太多要填写的内容,有时还关联多个子单据,客户不想一个一个地填写,他们想从已有的单据上复制数据,克隆成一条新的记录.本文将介绍如何克隆一条记录,包括它的子单据以生成一条新的 ...
- JavaScript学习笔记——JS中的变量复制、参数传递和作用域链
今天在看书的过程中,又发现了自己目前对Javascript存在的一个知识模糊点:JS的作用域链,所以就通过查资料看书对作用域链相关的内容进行了学习.今天学习笔记主要有这样几个关键字:变量.参数传递.执 ...
- java学习笔记之字符流文件复制
字符文件复制 FileReader fr =new FileReader("b.txt");//绑定源文件 FileWriter fw= new FileWriter(" ...
- MongodDB学习笔记(二)(复制)
mongoDB的复制非常容易配置,其实现有两种方式,一种是主从复制,一种是复制集,前者的好处是容易配置,但是如果主服务器宕掉了,整个系统就崩溃了,后者的好处是如果主服务器宕掉了,其他服务器会通过投票选 ...
- Linux学习笔记:cp和scp复制文件
拷贝文件和文件夹,在Linux上通过cp命令来实现. cp:用户当前机器的文件复制 scp:通过ssh本机和其他机器的文件复制 secure copy cp a.txt b.txt scp a.txt ...
- redis学习笔记——RDB、AOF和复制时对过期键的处理
AOF.RDB和复制功能对过期键的处理 生成RDB文件 在执行SAVE命令或者BGSAVE命令创建一个新的RDB文件时,程序会对数据库中的键进行检查,已过期的键不会被保存到新创建的RDB文件中.举个例 ...
- MongoDB学习笔记(六、MongoDB复制集与分片)
目录: MongoDB部署模型 MongoDB可复制集 MongoDB读写分离 分片架构部署 最佳实践 MongoDB部署模型: 单机 -> 可复制集 -> 分片集群 MongoDB可复制 ...
随机推荐
- ST Debug (printf) Viewer for Jlink
Debug (printf) Viewer http://www.keil.com/support/man/docs/uv4/uv4_db_dbg_serialwin.htm Serial Windo ...
- Sentinel控制台前端开发环境搭建
Sentinel:分布式系统的流量防卫兵. 官网:https://sentinelguard.io Github:https://github.com/alibaba/sentinel Wiki:ht ...
- 解决问题:OSError: mysql_config not found
通过pip install mysqlclient时报出了OSError: mysql_config not found错误,如下 Traceback (most recent call last): ...
- java内存空间简述
JVM的内存空间: 1. 寄存器 (Registers):最快的保存区域,位于处理器内部,由编译器分配.主要作用是记录当前线程所执行的字节码的行号.字节码解释器工作时就是通过改变当前线程的程序计数器选 ...
- tomcat注册成服务
1>修改"bin\service.bat"文件 服务名:下图中的SERVICE_NAME 服务显示名称:下图中的DISPLAYNAME 服务描述:Description 2& ...
- Qt编写控件属性设计器8-网络采集
一.前言 上一篇文章已经打通了数据源之一的串口采集,这次要说的是网络采集,网络通信目前用的最多的是三种,TCP/UDP/HTTP,其中tcp通信又包括了客户端服务端两种,tcp通信才用了多次握手机制不 ...
- 启后台JOB处理单据遇到锁定问题
/用户XXX已经处理采购凭证 9000036590 DN过账失败:/已冻结临时过账:用户 XXX已冻结编号范围 /用户XXX已经处理采购凭证 9000036589 ???问题:怎么检查采购订单正在 ...
- AFN使用etag进行网络缓存
前提:后台返回的接口带etag 第一步 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( ...
- MySQL5.1中文文档学习笔记——第1章:一般信息(一)
原文地址 MySQL软件是一种开放源码软件. 开放源码"意味着任何人都能使用和改变软件.任何人都能从Internet下载MySQL软件,而无需支付任何费用.如果愿意,你可以研究源码并进行恰当 ...
- 最新 哔哩哔哩java校招面经 (含整理过的面试题大全)
从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.哔哩哔哩等10家互联网公司的校招Offer,因为某些自身原因最终选择了哔哩哔哩.6.7月主要是做系统复习.项目复盘.Leet ...